【问题标题】:What is a raw string?什么是原始字符串?
【发布时间】:2019-11-04 16:38:50
【问题描述】:

我在 C++17 草案 n4713 中遇到了这段代码 sn-p:

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

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

【问题讨论】:

    标签: c++ c++11 rawstring


    【解决方案1】:

    基本上,raw string 文字是一个字符串,其中不处理 C++ 的转义字符(如 \n \t 或 \" )。以R"( 开头并以)" 结尾的原始字符串文字,在C++11 中引入

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

    前缀 - 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

    【讨论】:

    • 但是在代码中 R 被定义为 "x" 并且在 #define 扩展之后代码是 const char* s = "x""y"; 并且没有任何 R"(。
    【解决方案2】:

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

    C++参考:string literal

    原始字符串的定义如下:

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

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

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

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

    【讨论】:

    • 您确定需要删除定义吗?我认为如果是这种情况,那么当前状态下的示例将不是定义不明确的原始字符串,而是定义明确的字符串文字。
    【解决方案3】:

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

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

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

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

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

    【讨论】:

    • 我不知道你为什么需要括号。我在上面看到的第一件事。现在太明显了。请注意,您仍然可以像 uR 和 u8R 一样为其添加前缀,这也适用于 C,但仅适用于 gnu -std=gnu99 起
    猜你喜欢
    • 1970-01-01
    • 2011-01-06
    • 2022-10-09
    • 2022-12-24
    • 2017-01-21
    • 1970-01-01
    相关资源
    最近更新 更多