【问题标题】:Why is raw string literal parsed before trailing backslash?为什么在尾随反斜杠之前解析原始字符串文字?
【发布时间】:2022-01-25 13:56:47
【问题描述】:

Phases of translation开始,反斜杠连接下一行发生在阶段2,字符串文字评估发生在阶段3。那么为什么下面的代码之前会进行字符串评估?

#include<string>
#include<iostream>

int main() {
    std::string s = R"(before\
after)";
    std::cout << s;
}

给予:

before\
after

代替:

beforeafter

第二阶段

  1. 只要反斜杠出现在行尾(紧跟零个或多个空格字符,而不是换行符后跟(C++23 起)换行符),这些字符将被删除,合并两个物理源代码行到一个逻辑源行。 [...]

第三阶段

  1. 源文件被分解为 cmets、空白字符序列(空格、水平制表符、换行符、垂直制表符和换页符)和预处理标记,如下所示: a) 标题名称,例如或“myfile.h” b) 标识符 c) 预处理数字 d) 字符和字符串文字,包括用户定义的(C++11 起)[...]

【问题讨论】:

标签: c++ c-preprocessor string-literals backslash rawstring


【解决方案1】:

原始字符串文字explicitly undo phases 1&2:

如果下一个字符开始的字符序列可能是原始字符串文字的前缀和初始双引号,例如 R",则下一个预处理标记应是原始字符串文字。在初始双引号和最终双引号之间原始字符串的字符,在阶段 1 和 2(通用字符名称和行拼接)中执行的任何转换都将被还原;此还原应在识别任何 d-char、r-char 或定界括号之前应用。

【讨论】:

  • 那么编译器可以回到过去吗?酷!
  • @PaulSanders:标准定义了行为;实施决定如何实施。标准的编写方式就像在进入下一个阶段之前在每个阶段都处理了整个文件,但实现不需要这样编写(几乎可以肯定不是)。
  • 我不是认真的:)
猜你喜欢
  • 2010-10-13
  • 1970-01-01
  • 1970-01-01
  • 2019-08-25
  • 2019-07-17
  • 2014-09-12
  • 2012-06-25
  • 1970-01-01
相关资源
最近更新 更多