我在 C++17 草案 n4713 中遇到了这个代码片段:
#define R "x"
const char* s = R"y"; // ill-formed raw string, not "x" "y"
什么是“原始字符串”?它有什么作用?
原始字符串文字是字符串文字,旨在更容易地包含嵌套字符,例如引号和反斜杠,这些字符通常具有分隔符和转义序列开头的含义。例如,它们对于编码 HTML 之类的文本很有用。例如,对比
"<a href=\"file\">C:\\Program Files\\</a>"
这是一个常规的字符串文字,与
R"(<a href="file">C:\Program Files\</a>)"
这是一个原始字符串文字。在这里,除了引号之外使用括号允许 C++ 将嵌套引号与分隔字符串本身的引号区分开来。
基本上,原始字符串文字是不处理 C++的转义字符(如\n
\t
或)的字符串。\"
以 开头R"(
和结尾的原始字符串文字)"
,在C++11
前缀(可选)R“分隔符(原始字符)分隔符”
前缀 - L、u8、u、U 之一
感谢@Remy Lebeau,
delimiter
它是可选的,通常被省略,但在某些极端情况下确实需要它,特别是如果字符串内容中包含字符序列)"
,例如: R"(...)"...)"
,所以你需要一个分隔符来避免错误,例如:R"x(...)"...)x"
。
看一个例子:
#include <iostream>
#include <string>
using namespace std;
int main()
{
string normal_str="First line.\nSecond line.\nEnd of message.\n";
string raw_str=R"(First line.\nSecond line.\nEnd of message.\n)";
cout<<normal_str<<endl;
cout<<raw_str<<endl;
return 0;
}
输出:
第一行。
第二行。
消息结束。
第一行。\n第二行。\n消息结束。\n
原始字符串文字。用于避免转义任何字符。分隔符之间的任何内容都将成为字符串的一部分。前缀(如果存在)具有与上述相同的含义。
C++参考:字符串字面量
原始字符串定义如下:
string raw_str=R"(First line.\nSecond line.\nEnd of message.\n)";
不同之处在于原始字符串会忽略(转义)所有特殊字符,如 \n ant \t 并像普通文本一样威胁它们。
因此,上面的行将只是其中包含 3 个实际 \n 的一行,而不是 3 个单独的行。
您需要删除定义行并在字符串周围添加括号以被视为原始字符串。