在C和C ++中反斜杠后的空白字符

反斜杠后C和C ++标准对空白字符(或几个字符)的说法是什么? 它是否保证无论如何加入线路?

int main() { // Comment \ int foo; } 

在这种情况下,MSVC和gcc的工作方式不同。

作为参考,标准引用是(§2.2/ 1,删节,强调我的):

翻译阶段

[…]
2. 删除反斜杠字符( \ )后面紧跟一个换行符的每个实例,拼接物理源代码行以形成逻辑源代码行 。 只有任何物理源线上的最后一个反斜杠才有资格成为这种拼接的一部分。 因此,如果生成与通用字符名称的语法匹配的字符序列,则行为未定义。 一个非空的并且不以换行符结尾的源文件,或者在任何此类拼接发生之前以反斜杠字符开头的新行字符结尾的源文件,应该被处理,就像另一个新文件一样 – 行字符被附加到文件中。
[…]

其他答案提到的实现定义部分在“新行”的定义中。

(请注意,注释在第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; 将被附加到评论的末尾,然后最终删除。)

C标准将实现定义为文本文件如何分成行(作为转换阶段1的一部分,如果内存服务)。 出于\ -newline的目的,GCC定义了一个以零个或多个ASCII水平空白字符(SPC,TAB,VT或FF)结尾的行,后跟三个常见的ASCII行终止序列之一:CR,LF或CR LF 。

我不知道MSVC做了什么,但如果它不同,我不会感到惊讶。