4

C 和 C++ 标准对反斜杠后的空白字符(或多个字符)有何规定?它是否保证无论如何都加入行?

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

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

4

2 回答 2

7

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

翻译阶段

[...]
2.后跟换行符的反斜杠字符 ( ) 的每个实例都\被删除,将物理源代码行拼接成逻辑源代码行。只有任何物理源行上的最后一个反斜杠才有资格成为此类接头的一部分。结果,如果生成了与通用字符名称的语法匹配的字符序列,则行为未定义。如果源文件不为空且不以换行符结尾,或者在任何此类拼接发生之前以换行符结尾且紧接在反斜杠字符之前,则应将其视为附加的 new-行字符被附加到文件中。
[...]

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

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

于 2012-09-06T17:31:39.070 回答
5

C 标准让它实现定义文本文件如何分成几行(作为翻译阶段 1 的一部分,如果有记忆的话)。出于\-newline 的目的,GCC 将行结尾定义为零个或多个 ASCII 水平空白字符(SPC、TAB、VT 或 FF),后跟三个常见的 ASCII 行终止序列之一:CR、LF 或 CR LF。

我不知道 MSVC 做了什么,但如果它有所不同,我一点也不感到惊讶。

于 2012-09-06T17:28:15.163 回答