clang: 在单行注释中用 space 分隔的反斜杠和换行符

clang: backslash and newline separated by space in single line comment

为什么这样 (live):

int main()
{
    // my pretty comment /\   
    //
    // 


}

发出 clang 警告:

warning: backslash and newline separated by space [-Wbackslash-newline-escape]

?

看起来该代码完全有效,没有任何缺陷。

来自 C++14 草案 [4296]:

2.2 翻译阶段[lex.phases]

  1. Each instance of a backslash character () immediately followed by a new-line character is deleted, splicing physical source lines to form logical source lines. Only the last backslash on any physical source line shall be eligible for being part of such a splice. Except for splices reverted in a raw string literal, if a splice results in a character sequence that matches the syntax of a universal-character-name, the behavior is undefined. A source file that is not empty and that does not end in a new-line character, or that ends in a new-line character immediately preceded by a backslash character before any such splicing takes place, shall be processed as if an additional new-line character were appended to the file.

正是它的第一句话给了你警告。

在您的示例代码中:

int main()
{
    // my pretty comment /\
    int x;
    int y = x;    
}

int x; 行将加入到上面一行的注释中,并将在下一阶段的翻译中删除。所以你得到了一个错误:

error: use of undeclared identifier 'x'

但是

int main()
{
    // my pretty comment /\   
    //
}

有效,不会导致错误。你可能会注意到 g++(没有 -Wall)不会在这里给出警告。它看起来像是无用的警告,但我认为编译器可能会将其视为新行字符转义可能失败。所以,还是在这里给大家提个醒吧。

Do we need this warning there ?

实际上,不,我们这里不需要它。但这只是一个诊断警告,有这样的警告能够检测到可能的问题,总比没有要好。

我想,这里还有一个原因比如:

  1. 人们通常不会逃跑spaces。为什么? :)

  2. 这里的多行注释是/**/序列。

您的代码绝对不是完全有效且没有任何缺陷。

行尾的反斜杠用于合并两个源代码行。行尾的反斜杠但中间有 space 很可能是合并两个源代码行的失败尝试,因此值得强烈警告。

在你的例子中,反斜杠只是为了混淆人们。哪个更糟,所以将其删除。