在C++中有两种类型的字面量,一种是1、11、111这种数字字面量,这种字面量没有歧义,可以原封不动的输出出来;还有一种是字符串字面量,如“Hello C++”、“D:\code\test\main.cc”,在编程过程中,常常会遇见使用的字符串带有特殊符号的情况如转义字符“\”,为了正确的使用这些字符串,我们往往需要对这些字符串进行特殊处理,这时原始字面量就能很好的解决问题了。
C++11中添加了定义原始字符串字面量的方法,定义方式为:R"xxx(原始字符串的内容)xxx",其中括号两边的xxx起注释作用,可以省略。原始字面量R可以直接表示字符串的实际含义,而不需要额外对字符串做转义或连接等操作。
#include <iostream>
#include <string>
using namespace std;
int main() {
string str1 = "D:\code\test\main.cc";
string str2 = "D:\\code\\test\\main.cc";
string str3 = R"nomore15(D:\code\test\main.cc)nomore15";
cout << str1 << endl;
cout << str2 << endl;
cout << str3 << endl;
return 0;
}
输出结果:
在str1中\c和\m转义失败,会保持原样输出,而\t则转义成了制表符。在str2中,用\将其本身从特殊字符转译成了普通字符,故会将\保持原样输出。在str3中,()左右两边的字符均被忽略,而()中的内容不会做任何处理。
\除了做转义字符,还会做续航符。所以当一个字符串占了多行的时候也可以使用原始字面量。
#include<iostream>
#include<string>
using namespace std;
int main()
{
string str1 = "\
<html>\
<head>\
<title>\
C++学习\
</title>\
</head>\
<body>\
<p>\
原始字面量\
</p>\
</body>\
</html>";
string str2 = R"(
<html>
<head>
<title>
C++学习
</title>
</head>
<body>
<p>
原始字面量
</p>
</body>
</html>)";
cout << str1 << "\n" << endl;
cout << str2 << endl;
return 0;
}
输出结果:
在C++11之前如果一个字符串分别写到了不同的行里边,需要加连接符,这种方式不仅繁琐,还破坏了表达式的原始含义,如果使用原始字面量就变得简单很多,很强直观,可读性强。
在R “xxx(raw string)xxx” 中,原始字符串必须用括号()括起来,括号的前后可以加其他字符串,所加的字符串会被忽略,并且加的字符串必须相同且在括号两边同时出现。xxx中不能出现空格且不能超过15个ASCII字符。