30

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

#define R "x"
const char* s = R"y"; // ill-formed raw string, not "x" "y"

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

4

3 回答 3

41

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

"<a href=\"file\">C:\\Program Files\\</a>"

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

R"(<a href="file">C:\Program Files\</a>)"

这是一个原始字符串文字。在这里,除了引号之外使用括号允许 C++ 将嵌套引号与分隔字符串本身的引号区分开来。

于 2019-06-21T20:31:05.160 回答
27

基本上,原始字符串文字是不处理 C++的转义字符(如\n \t或)的字符串。\"以 开头R"(和结尾的原始字符串文字)",在C++11

前缀(可选)R“分隔符(原始字符)分隔符”

前缀 - L、u8、u、U 之一

感谢@Remy Lebeaudelimiter它是可选的,通常被省略,但在某些极端情况下确实需要它,特别是如果字符串内容中包含字符序列)",例如: 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-21T20:32:29.387 回答
0

原始字符串文字。用于避免转义任何字符。分隔符之间的任何内容都将成为字符串的一部分。前缀(如果存在)具有与上述相同的含义。

C++参考:字符串字面量

原始字符串定义如下:

string raw_str=R"(First line.\nSecond line.\nEnd of message.\n)";

不同之处在于原始字符串会忽略(转义)所有特殊字符,如 \n ant \t 并像普通文本一样威胁它们。

因此,上面的行将只是其中包含 3 个实际 \n 的一行,而不是 3 个单独的行。

您需要删除定义行并在字符串周围添加括号以被视为原始字符串。

于 2019-06-21T20:39:18.953 回答