为什么这(live):
int main()
{
// my pretty comment /\
//
//
}
发出警告:
warning: backslash and newline separated by space [-Wbackslash-newline-escape]
看起来代码完全有效,没有任何陷阱。
答案 0 :(得分:3)
来自C ++ 14草案[4296]:
2.2翻译阶段[lex.phases]
- 删除反斜杠字符()后面紧跟一个新行字符的每个实例,将物理源代码行拼接到 形成逻辑源代码行。任何物理上只有最后一个反斜杠 源线应有资格成为此类拼接的一部分。除了 对于在原始字符串文字中恢复的拼接,如果拼接导致a 与a的语法匹配的字符序列 通用字符名称,行为未定义。源文件 这不是空的,也不是以换行符结尾,或者 以反斜杠开头的新行字符结束 在进行任何此类拼接之前,应将其处理为 如果在文件中附加了一个额外的换行符。
醇>
它的第一句话确实给出了警告。
在您的示例代码中:
int main()
{
// my pretty comment /\
int x;
int y = x;
}
int x;
行将加入上面一行中的注释,并将在下一个翻译阶段删除。所以你得到一个错误:
错误:使用未声明的标识符'x'
然而
int main()
{
// my pretty comment /\
//
}
有效且不会导致错误。您可能会注意到g++
(没有-Wall
)不会在此处发出警告。它看起来像无用的警告但我认为编译器可能会将其视为可能失败的新行字符转义。所以,最好在这里给你警告。
我们在那里需要这个警告吗?
实际上,不,我们这里不需要它。但它只是一个诊断警告,最好有这样的警告,以便能够发现可能的问题,而不是根本没有。
我认为,这也是一个原因:
人们通常不会逃避spaces
。为什么? :)
对于多行评论,此处有/*
和*/
个序列。
答案 1 :(得分:0)
你的代码绝对不是没有任何陷阱的完全有效。
该行末尾的反斜杠用于合并两个源代码行。该行末尾的反斜杠但中间有一个空格很可能是合并两个源代码行的失败尝试,因此值得一个非常严格的警告。
现在,在您的情况下,反斜杠就是让人迷惑的地方。哪个更糟糕,所以删除它。