我在C++17 draft n4713中偶然发现了以下代码片段:
#define R "x"
const char* s = R"y"; // ill-formed raw string, not "x" "y"
什么是“原始字符串”?是干什么的呢?
发布于 2019-06-21 20:31:05
原始字符串文字是字符串文字,旨在更容易地包括嵌套字符,如引号和反斜杠,这些字符通常具有作为分隔符和转义序列开始的含义。比如说,它们对于像HTML这样的文本编码很有用。例如,对比度
"<a href=\"file\">C:\\Program Files\\</a>"
,它是一个常规的字符串文字,带有
R"(<a href="file">C:\Program Files\</a>)"
它是一个原始的字符串文字。在这里,除了引号之外,使用括号还允许C++将嵌套引号与分隔字符串本身的引号区分开来。
发布于 2019-06-21 20:32:29
基本上,raw string文本是不处理C++的转义字符(如\n
、\t
或\"
)的字符串。以R"(
开头,以)"
结尾的原始字符串文字,在C++11
中引入
前缀(可选)R“分隔符( raw_characters )分隔符”
前缀- 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
发布于 2019-06-21 20:39:19
原始字符串文字。用于避免对任何字符进行转义。分隔符之间的任何内容都将成为字符串的一部分。前缀,如果存在,具有与上述相同的含义。
C++Reference:string literal
原始字符串的定义如下:
string raw_str=R"(First line.\nSecond line.\nEnd of message.\n)";
不同之处在于,原始字符串忽略(转义)所有特殊字符,如\n ant \t,并像普通文本一样威胁它们。
因此,上面的行将只有一行,其中包含3个实际的\n行,而不是3个单独的行。
您需要删除define行,并在字符串两边添加圆括号,以将其视为原始字符串。
https://stackoverflow.com/questions/56710024
复制