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]
- 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 ?
实际上,不,我们这里不需要它。但这只是一个诊断警告,有这样的警告能够检测到可能的问题,总比没有要好。
我想,这里还有一个原因比如:
人们通常不会逃跑spaces
。为什么? :)
这里的多行注释是/*
和*/
序列。
您的代码绝对不是完全有效且没有任何缺陷。
行尾的反斜杠用于合并两个源代码行。行尾的反斜杠但中间有 space 很可能是合并两个源代码行的失败尝试,因此值得强烈警告。
在你的例子中,反斜杠只是为了混淆人们。哪个更糟,所以将其删除。
为什么这样 (live):
int main()
{
// my pretty comment /\
//
//
}
发出 clang 警告:
warning: backslash and newline separated by space [-Wbackslash-newline-escape]
?
看起来该代码完全有效,没有任何缺陷。
来自 C++14 草案 [4296]:
2.2 翻译阶段[lex.phases]
- 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 ?
实际上,不,我们这里不需要它。但这只是一个诊断警告,有这样的警告能够检测到可能的问题,总比没有要好。
我想,这里还有一个原因比如:
人们通常不会逃跑
spaces
。为什么? :)这里的多行注释是
/*
和*/
序列。
您的代码绝对不是完全有效且没有任何缺陷。
行尾的反斜杠用于合并两个源代码行。行尾的反斜杠但中间有 space 很可能是合并两个源代码行的失败尝试,因此值得强烈警告。
在你的例子中,反斜杠只是为了混淆人们。哪个更糟,所以将其删除。