【发布时间】: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
第二阶段
- 只要反斜杠出现在行尾(紧跟零个或多个空格字符,而不是换行符后跟(C++23 起)换行符),这些字符将被删除,合并两个物理源代码行到一个逻辑源行。 [...]
第三阶段
- 源文件被分解为 cmets、空白字符序列(空格、水平制表符、换行符、垂直制表符和换页符)和预处理标记,如下所示: a) 标题名称,例如或“myfile.h” b) 标识符 c) 预处理数字 d) 字符和字符串文字,包括用户定义的(C++11 起)[...]
【问题讨论】:
-
字符串文字!= 原始字符串文字
-
"...在阶段 1 和阶段 2 中在任何原始字符串文字的初始和最终双引号之间执行的任何转换 都将恢复 ...." en.cppreference.com/w/cpp/language/string_literal
标签: c++ c-preprocessor string-literals backslash rawstring