反斜杠后,C和C ++标准对空白字符(或多个字符)的说法是什么?它是否保证无论如何加入线路?
int main()
{
// Comment \
int foo;
}
MSVC和gcc在这种情况下的工作方式不同。
答案 0 :(得分:7)
作为参考,标准引用是(§2.2/ 1,删节,强调我的):
翻译阶段
[...]
2. 删除反斜杠字符(\
)后面紧跟一个换行符的每个实例,拼接物理源代码行以形成逻辑源代码行。只有任何物理源线上的最后反斜杠才有资格成为此类拼接的一部分。因此,如果生成与通用字符名称的语法匹配的字符序列,则行为未定义。一个非空的并且不以换行符结尾的源文件,或者在任何此类拼接发生之前以反斜杠字符开头的新行字符结尾的源文件,应被视为另外一个新文件 - 行字符被附加到文件中 [...]
其他答案提到的实现定义部分在“new-line”的定义中。
(请注意,评论在第3阶段之前不会被替换,因此在此代码中:
int main()
{
int x = 0;
// assuming the definition of new-line is as expected, this function
// will return 0, not 5 (no whitespace after this backslash: ) \
x = 5;
return x;
}
x = 5;
将附加到评论的末尾,然后最终删除。)
答案 1 :(得分:5)
C标准使其实现定义了文本文件如何分成行(作为转换阶段1的一部分,如果内存服务)。出于\
- 换行的目的,GCC定义了一个以零个或多个ASCII水平空白字符(SPC,TAB,VT或FF)结尾的行,后跟三个常见的ASCII行终止序列之一:CR,LF或CR LF。
我不知道MSVC做了什么,但如果不同的话我也不会感到惊讶。