C++ 叮当声:单行注释中用空格分隔的反斜杠和换行符
为什么会这样(): 发出叮当声警告:C++ 叮当声:单行注释中用空格分隔的反斜杠和换行符,c++,clang,C++,Clang,为什么会这样(): 发出叮当声警告: warning: backslash and newline separated by space [-Wbackslash-newline-escape] ? 看起来该代码完全有效,没有任何陷阱。来自C++14草稿: 2.2个翻译阶段[法律阶段] 删除紧跟着新行字符的反斜杠字符()的每个实例,将物理源行拼接到 形成逻辑源行。只有任何物理对象上的最后一个反斜杠 电源线应有资格成为此类拼接的一部分。除了 对于以原始字符串文字还原的拼接,如果拼接导致 与字符串
warning: backslash and newline separated by space [-Wbackslash-newline-escape]
?
看起来该代码完全有效,没有任何陷阱。来自C++14草稿:
2.2个翻译阶段[法律阶段]
int main()
{
// my pretty comment /\
int x;
int y = x;
}
intx代码>行将加入到上面行中的注释中,并将在翻译的下一阶段删除。所以你犯了一个错误:
错误:使用未声明的标识符“x”
然而
int main()
{
// my pretty comment /\
//
}
是有效的,不会导致错误。您可能会注意到,g++
(没有-Wall
)不会在此处发出警告。这看起来像是无用的警告,但我认为编译器可能会将其视为新行字符转义的失败。所以,最好在这里给你一个警告
我们需要这个警告吗
事实上,不,我们这里不需要。但这只是一个诊断警告,最好有这样的警告,以便能够检测到可能的问题,而不是根本没有警告
我想,这也是一个原因,比如:
人们通常不会逃离空间
。为什么?:)
对于多行注释,这里有/*
和*/
序列
从C++14草稿中:
2.2个翻译阶段[法律阶段]
删除紧跟着新行字符的反斜杠字符()的每个实例,将物理源行拼接到
形成逻辑源行。只有任何物理对象上的最后一个反斜杠
电源线应有资格成为此类拼接的一部分。除了
对于以原始字符串文字还原的拼接,如果拼接导致
与字符串的语法匹配的字符序列
通用字符名,行为未定义。源文件
不为空且不以新行字符结尾,或
以紧跟在反斜杠前面的新行字符结尾的
在进行任何此类拼接之前,应按照以下方式处理字符:
如果文件中追加了其他新行字符
正是它的第一句话给了你警告
在您的示例代码中:
int main()
{
// my pretty comment /\
int x;
int y = x;
}
intx代码>行将加入到上面行中的注释中,并将在翻译的下一阶段删除。所以你犯了一个错误:
错误:使用未声明的标识符“x”
然而
int main()
{
// my pretty comment /\
//
}
是有效的,不会导致错误。您可能会注意到,g++
(没有-Wall
)不会在此处发出警告。这看起来像是无用的警告,但我认为编译器可能会将其视为新行字符转义的失败。所以,最好在这里给你一个警告
我们需要这个警告吗
事实上,不,我们这里不需要。但这只是一个诊断警告,最好有这样的警告,以便能够检测到可能的问题,而不是根本没有警告
我想,这也是一个原因,比如:
人们通常不会逃离空间
。为什么?:)
对于多行注释,这里有/*
和*/
序列
如果没有任何陷阱,您的代码肯定不是完全有效的
行尾的反斜杠用于合并两个源代码行。行尾的反斜杠(但中间有空格)很可能是试图合并两个源代码行的失败尝试,因此应该受到非常严厉的警告
在你的例子中,反斜杠只是用来迷惑人们的。哪一个更糟糕,所以把它去掉 如果没有任何陷阱,您的代码肯定不是完全有效的
行尾的反斜杠用于合并两个源代码行。行尾的反斜杠(但中间有空格)很可能是试图合并两个源代码行的失败尝试,因此应该受到非常严厉的警告
在你的例子中,反斜杠只是用来迷惑人们的。哪一个更糟糕,所以把它去掉 直接后跟换行符“escapes”的反斜杠将删除换行符。这两条线连接在一起。从类似于您的代码的内容来看,情况并非如此,因为空格是。。。隐形。@dyp,也许我的问题不好,但我想问,为什么我们需要这样的警告?是的,在这样的情况下会出现问题,但在上面的情况下它是无用的。我猜触发警告(编译器诊断)的代码根本不会尝试检测它是否是实际问题。这样的试探法通常很复杂,可能会产生误判,因为这很危险。现在还不清楚你真正的意思是什么(也许你是无意中把这个空间放在那里的)。对代码进行一些不可见的更改(删除空格)可能会显著改变代码的含义。还要注意,许多代码样式需要删除尾随空格,有些编辑器可以自动删除尾随空格。只需在该换行符之前和反斜杠之后添加空格。反斜杠后面紧跟着一个换行符“escapes”/即可删除该换行符。这两条线连接在一起。事实并非如此