目录
[1. 原始字面量的使用](#1. 原始字面量的使用)
[2. 注意事项](#2. 注意事项)
1. 原始字面量的使用
在C++11 中添加了定义原始字符串的字面量,定义方式为 R "xxx(原始字符串)xxx",其中()两边的字符串可以省略。原始字面量R可以直接表示字符串的实际含义,不需要额外的转义字符进行转义
例如,当我们要打印一个路径时,由于路径字符串中常常包含一些特殊字符,传统方法通常需要使用转义字符 '\' 来处理。但如果使用原始字符串字面量,就可以轻松解决这个问题。
cpp
int main(int argc, char const *argv[])
{
string str = "D:\hello\world\test.text";
cout << "str: " << str << endl;
string str1 = "D:\\hello\\world\\test.text";
cout << "str1: " << str1 << endl;
string str2 = R"(D:\hello\world\test.text)";
cout << "str2: " << str2 << endl;
return 0;
}
输出结果
cpp
D:helloworld est.text
D:\hello\world\test.text
D:\hello\world\test.text
- 第一条语句中,\h 和 \w 转义失败,对应地字符串会原样输出
- 第二条语句中,第一个反斜杠是对第二个反斜杠的转义,最终才能得到一个没有特殊含义的普通字符 \
- 第三条语句中,使用了原始字面量 R() 中的内容来描述路径的原始字符串,因此无需做任何处理
在 C++11 之前如果一个字符串分别写到了不同行里,需要加连接符,这种方式不仅繁琐,还破坏了表达式的原始含义,如果使用原始字面量就变得简单很多,很强直观,可读性强。我们通过一个输出 HTML 标签的例子体会一下原始字面量。
cpp
int main(int argc, char const *argv[])
{
string str = R"(<html>
<head>
<title>
海贼王
</title>
</head>
<body>
<p>
我是要成为海贼王的男人!!!
</p>
</body>
</html>)";
cout << str << endl;
return 0;
}
输出结果
cpp
str: <html>
<head>
<title>
海贼王
</title>
</head>
<body>
<p>
我是要成为海贼王的男人!!!
</p>
</body>
</html>
2. 注意事项
最后强调一个细节:在 R "xxx()xxx" 中,原始字符串必须用括号()括起来,括号的前后可以加其他字符串,所加的字符串会被忽略,并且加的字符串必须在括号两边同时出现(两边出现的字符串长度、顺序都要一模一样)。因此,为了方便,我们在实际使用中通常不会在 () 两侧加字符串。
cpp
std::string s4 = R"123(abc\def)123"; // 成功输出 abc\def
std::string s5 = R"123(abc)456"; // 报错,左侧"123"和右侧"456",不匹配