`
编程峰子
  • 浏览: 5412 次
  • 性别: Icon_minigender_1
  • 来自: 黑龙江
社区版块
存档分类
最新评论

C++11新特性探索(一)——原生字符串字面量问题

阅读更多

原生字符串字面量 是C++11标准引入的用于避免手动将字符串换码的新特性。

按照标准要求,其内部的一切文字都将原封不动地、所见即所得地声明为字符串。现在的问题是,预处理指令理应先于一切其他语言特性进行,在一些编译系统中(如 MinGW),预处理阶段甚至是由 cpp.exe(CPreProcessor)这一单独的程序完成的。而预处理指令处于一行开头且以#开始,如果在原生字符串字面量中的一个新行里顶头写上一句 #include 指令,会发生什么呢?

在C++98/03中,这个担心是没有必要的,因为字符串必须在一行内声明完,但由于C++11的这个新特性的提出,就产生了这一问题。事实的真相到底是什么呢?实验让你眼见为实:

//test.cpp
#include <iostream>

using namespace std;

/**测试从这里开始*/
const char str[] =
R"(
#include "example.txt"
)"
;

int main(int argc,char * argv[])
{
	cout << "实际变量 str 的内容是:" << endl << str << endl;
	return 0;
}
//example.txt
样例测试字符串

 

编译环境:Windows 7 旗舰版 Sevice Pack 1Intel(R) Celeron(R) M CPU 723,32位操作系统,TDM-GCC-32 4.7.2

编译选项:mingw32-g++ test.cpp -o test.exe -std=c++11

下面运行程序。

如果 #include 得到先一步执行,那么程序将输出 example.txt 的内容(试验时它的内容是“样例测试字符串”);如果编译器无视了 #include 指令,那么程序将输出如上代码中写入的“\n#include "example.txt"\n”。

 运行结果是这样的:

prompt> mingw32-g++ test.cpp -o test.exe -std=c++11

 

prompt> test

实际变量 str 的内容是:

        #include "example.txt"

 

显然,#include 指令并未被展开。

我们的结论是:原生字符串字面量中的一切文字,包括预处理指令,都会被看做是“纯”的、“普通”的文字,而不会发挥(它可能具有的)语义功能;而这也与标准中对它的“原生的、不加处理的”的描述相符。

 

  • 大小: 46.3 KB
分享到:
评论

相关推荐

    解读C++11 原生字符串

    C++11引入了原生字符串字面量(Raw String Literals),它是一种全新的字符串定义方式,旨在简化多行字符串或包含特殊字符的字符串编写。在C++11之前,当程序员需要在字符串中包含特殊字符,如路径中的反斜杠,或...

    深入理解C++11:C++11新特性解析与应用

    2748.3.1 字符集、编码和Unicode 2748.3.2 C++11中的Unicode支持 2768.3.3 关于Unicode的库支持 2808.4 原生字符串字面量 2848.5 本章小结 286附录A C++11对其他标准的不兼容项目 287附录B 弃用的特性 294附录C ...

    C/C++11-20的标准API中文帮助文档CHM

    - **用户定义字面量(User-defined literals)**:允许自定义数字、字符串等类型的字面量后缀。 C++20引入了更多新特性,如模块化(Modules)、协程(Coroutines)、概念(Concepts)等,进一步提升了C++的现代性和...

    C++11/14的新特性(更简洁)

    首先,C++11引入了原生字符串字面量(Raw String Literals),它允许程序员在字符串中直接包含特殊字符,无需使用转义字符。原生字符串字面量以`R`前缀开始,并由一对圆括号`()`包围。在圆括号内,你可以直接写入...

    《C++17 完全指南》

    《C++17完全指南》是一本深入解析C++17新特性的书籍,由Nicolai M. Josuttis撰写。C++17是C++编程语言的一个重要版本,虽然相较于C++11的革新可能显得较为温和,但它引入了许多小而实用的改进,这些改进对提升开发...

    编程语言C++的标准(20草案)

    9. **字面量操作符(Literal operators)**:C++20允许用户自定义字面量操作符,比如定义时间单位或者复数字面量。 10. **字符串_view的改进**:`std::string_view`在C++20中获得了更多的函数,如`starts_with()`和...

    C11-20-zh.rar

    一、C++11的新特性 1. **自动类型推断(Auto)**:C++11引入了`auto`关键字,它允许编译器根据初始值自动推断变量的类型,简化了代码并减少了错误。 2. **右值引用(Rvalue References)**:右值引用用于实现移动...

    达内教育课件-C++

    - 原生类型安全的字面量:如字符串字面量("str")、整数字面量(123u)等。 - 多线程支持:std::thread和相关同步原语,如mutex和future,使得C++能够编写多线程程序。 学习C++需要理解其核心概念,并通过实际...

    C++/CLI Standard.pdf

    - **仅初始化字段**:介绍了一种新的字段类型——只读字段。 - **函数**:定义了函数的声明和调用规则。 - **属性**:描述了如何使用属性来简化对类成员的访问。 - **事件**:解释了事件的定义和触发机制。 - *...

    C_Standard_2011.rar

    8. 字符集扩展:C11引入了宽字符(宽字符串)的新的字面量形式,如`L""`和`u8""`,支持Unicode编码。 9. 遗留功能:C11对一些遗留的不推荐使用的函数和特性进行了标记,鼓励开发者使用更安全的替代方案。 10. 标准...

    Lua 5.3.5 for Windows MinGW-w32

    4. **字符串字面量增强**:支持长字符串字面量,可以跨越多行。 5. **元编程增强**:增强了元表和元方法的使用,提供了更多灵活性。 6. **错误处理**:改进了错误处理机制,允许在捕获错误时携带更多信息。 **...

    java面试题

    一个是在常量池中(因为"abc"是字符串字面量),另一个是在堆内存中(由new关键字创建的实例)。所以选项B正确。 6. javac编译器可以一次性编译多个源文件,并且可以指定环境变量如"class path",以及输出目录。...

    json.js和json2.js

    JSON的基本结构包括对象和数组,它们在JavaScript中分别对应为字面量对象(`{}`)和数组(`[]`)。对象是一组键值对,键必须是字符串,值可以是任意类型。数组则是一系列值的有序集合,每个值也可以是任意类型。 在...

    学习js的最好的资料(例子很丰富、也很经典)

    此外,还有模块化(CommonJS、AMD、ES6的import/export)、ES6的新特性(如箭头函数、模板字符串、解构赋值、类和扩展运算符等)、TypeScript(JavaScript的超集,提供静态类型检查)以及Node.js(JavaScript运行...

    JavaScript使用手册

    自ES6起,JavaScript引入了许多新特性,如类(class)、模块(import/export)、模板字符串(模板字面量)、解构赋值、Promise(异步处理)、箭头函数、let/const、增强的对象字面量和计算属性名等。 **JavaScript...

    wxJSMin_src.zip

    它的主要任务是删除JavaScript代码中的注释和多余的空白字符,同时通过合并相邻的字符串字面量来优化代码,从而减小文件大小。JSMin在保持代码可执行性的同时,最大限度地减少了HTTP请求的负担。 3. **源码文件解析...

    JAVA面试题

    字符串字面量 `"xyz"` 是直接在常量池中创建的,而`new String("xyz")`则会在堆上创建一个新的`String`对象,因此总共涉及到了两个对象的创建。 #### 8. 数组与`length`属性,以及`String`的`length()`方法 数组...

Global site tag (gtag.js) - Google Analytics