什么是原始字符串?

What is a raw string?

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

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

什么是 "raw string"?它有什么作用?

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

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

这是一个普通的字符串文字,

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

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

基本上是raw string literal is a string in which the escape characters (like \n \t or \" ) of C++ are not processed. A raw string literal which starts with R"( and ends in )" ,introduced in C++11

prefix(optional) R "delimiter( raw_characters )delimiter"

prefix - One of 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;
}

输出:

First line.

Second line.

End of message.

First line.\nSecond line.\nEnd of message.\n

Raw string literal. Used to avoid escaping of any character. Anything between the delimiters becomes part of the string. prefix, if present, has the same meaning as described above.

C++参考:string literal

原始字符串定义如下:

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

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

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

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