什么是原始字串?

JL2*_*210 2 c++ rawstring c++11

我在C ++ 17草案n4713中遇到了以下代码片段:

#define R "x"
const char* s = R"y"; // ill-formed raw string, not "x" "y"
Run Code Online (Sandbox Code Playgroud)

什么是“原始字符串”?它有什么作用?

Obl*_*ica 22

基本上,原始字符串文字是一个字符串,其中不处理 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;
}
Run Code Online (Sandbox Code Playgroud)

输出:

第一行。

第二行。

消息结束。

第一行。\n第二行。\n消息结束。\n

  • 但在代码中,`R` 被定义为 `"x"`,在扩展 `#define` 后,代码是 `const char* s = "x""y";` 并且没有任何 ` R”(`. (3认同)

tem*_*def 6

原始字符串文字是旨在简化包含引号和反斜杠之类的嵌套字符的字符串文字,这些字符通常在定界符和转义序列开始时具有含义。例如,它们对于编码HTML之类的文本很有用。例如对比

"<a href=\"file\">C:\\Program Files\\</a>"
Run Code Online (Sandbox Code Playgroud)

这是一个常规的字符串文字,带有

R"(<a href="file">C:\Program Files\</a>)"
Run Code Online (Sandbox Code Playgroud)

这是原始字符串文字。在这里,除引号外还使用括号可以使C ++区分嵌套引号和界定字符串本身的引号。

  • 我不知道你为什么需要括号。我第一眼看到的就是它。现在很明显了。请注意,您仍然可以为它添加前缀,如“uR”和“u8R”,这也适用于 C,但仅适用于 gnu“-std=gnu99” 及以上版本 (2认同)