单行注释延续 从C++标准(回到至少C++ 98)×2.2,注释2状态: 删除紧跟在新行字符后面的反斜杠字符(\)的每个实例,将物理源行拼接成逻辑源行。只有任何物理源线上的最后一个反斜杠才有资格成为此类拼接的一部分。除了在原始字符串文字中还原的拼接之外,如果拼接导致的字符序列与通用字符名的语法相匹配,则行为是未定义的。如果源文件不为空且不以新行字符结尾,或在任何此类拼接发生之前以紧跟反斜杠字符的新行字符结尾,则应对其进行处理,就像在文件中附加了额外的新行字符一样。

单行注释延续 从C++标准(回到至少C++ 98)×2.2,注释2状态: 删除紧跟在新行字符后面的反斜杠字符(\)的每个实例,将物理源行拼接成逻辑源行。只有任何物理源线上的最后一个反斜杠才有资格成为此类拼接的一部分。除了在原始字符串文字中还原的拼接之外,如果拼接导致的字符序列与通用字符名的语法相匹配,则行为是未定义的。如果源文件不为空且不以新行字符结尾,或在任何此类拼接发生之前以紧跟反斜杠字符的新行字符结尾,则应对其进行处理,就像在文件中附加了额外的新行字符一样。,c++,comments,C++,Comments,第§2.7节规定: 字符/*开始一条注释,以字符*/结尾。这些注释不会嵌套。字符//开始注释,注释以下一个新行字符结束。如果此类注释中存在换页符或垂直制表符,则在其与终止注释的新行之间仅应出现空白字符;无需诊断。[注意:注释字符//、/*和*/在//注释中没有特殊含义,与其他字符一样处理。同样,注释字符//和/*在//*注释中也没有特殊含义。] 我认为这两个词合在一起意味着: // My comment \ is valid // My comment \ still valid \ is v

第§2.7节规定:

字符/*开始一条注释,以字符*/结尾。这些注释不会嵌套。字符//开始注释,注释以下一个新行字符结束。如果此类注释中存在换页符或垂直制表符,则在其与终止注释的新行之间仅应出现空白字符;无需诊断。[注意:注释字符//、/*和*/在//注释中没有特殊含义,与其他字符一样处理。同样,注释字符//和/*在//*注释中也没有特殊含义。] 我认为这两个词合在一起意味着:

// My comment \
is valid

// My comment \ still valid \
is valid
warning C4010: single-line comment contains line-continuation character
在C++98中是合法的。在GCC 4.9.2中,这两种代码都在编译时没有任何诊断消息。在MSVC 2013中,这两项都产生了以下结果:

// My comment \
is valid

// My comment \ still valid \
is valid
warning C4010: single-line comment contains line-continuation character

如果您启用了警告作为错误(我是这样做的),这会导致程序无法成功编译(如果没有警告作为错误,它就可以正常工作)。标准中是否有禁止单行注释延续的内容,或者这是MSVC不符合标准的情况?

这不是合规性问题。您特别要求编译器将有效的构造视为错误,因此它就是这样做的


如果您指定
-Wcomment
-Wall

这不是合规性问题,GCC将给出相同的警告(或错误,如果要求)。您特别要求编译器将有效的构造视为错误,因此它就是这样做的


如果您指定
-Wcomment
-Wall

,GCC将给出相同的警告(或错误,如果要求),我认为MS对以下事实很敏感:

#define macro() \
    some stuff \
    // Intended as comment \
    more stuff
然后,在代码中使用
macro()
时会出现非常有趣的错误

或者只是意外地键入如下注释:

// The files for foo-project are in c:\projects\foo\
int blah;
(出现“未定义变量blah”的奇怪错误)

我永远不会在单行注释中使用行继续符,但如果您有足够的理由,只需在MSVC中关闭该警告


正如Mike所说:警告甚至不在标准的范围内——它只说明了什么是错误。如果启用“警告是错误”,您必须选择启用哪些警告,或者接受某些在构建中技术上有效(但不可靠)的构造将是不可接受的,因为编译器制造商已决定对此发出警告。尝试在gcc或clang中编写
if(c=getchar())
,看看在“高”上有多少错误和警告。然而,根据标准,它是完全有效的。

我想说,MS对这样一个事实很敏感,如果你做了以下事情:

#define macro() \
    some stuff \
    // Intended as comment \
    more stuff
然后,在代码中使用
macro()
时会出现非常有趣的错误

或者只是意外地键入如下注释:

// The files for foo-project are in c:\projects\foo\
int blah;
(出现“未定义变量blah”的奇怪错误)

我永远不会在单行注释中使用行继续符,但如果您有足够的理由,只需在MSVC中关闭该警告


正如Mike所说:警告甚至不在标准的范围内——它只说明了什么是错误。如果启用“警告是错误”,则必须对启用的警告进行选择,或者接受某些技术上有效(但可疑)的构造在构建中是不可接受的,因为编译器制造商已决定对此发出警告。尝试在gcc或clang中编写
if(c=getchar())
,看看在“高”上有多少错误和警告。然而,根据标准,它是完全有效的。

我没有给MSVC提供任何额外的标志来实际生成警告,这只是使用默认选项编译(除了/WX)。我在这里非常挑剔,只是因为我好奇。虽然我喜欢拥有-Werror+/WX的功能,但它似乎会导致不合规,特别是在代码实际符合的情况下(假设此代码符合)。我问了一个后续问题,@MuertoExcobito:“如果您启用了警告作为错误(我是这样做的)”,我没有向MSVC提供任何额外的标志来实际生成警告,这只是使用默认选项编译(除了/WX)。我在这里非常挑剔,只是因为我好奇。虽然我喜欢拥有-Werror+/WX的功能,但它似乎会导致不合规,特别是在代码实际符合的情况下(假设此代码符合)。我问了一个后续问题,@MuertoExcobito:“如果从我对标准的阅读中,您启用了警告作为错误(我是这样做的)”,则不包括警告或错误(MSVC和gcc使用它们),只包括程序违反任何规则时的“诊断消息”(除非规则没有明确要求)。在这种情况下,您的实现可以决定是否尝试生成程序,即使程序格式不正确,还是放弃。错误(在实际的编译器术语中)违反了编译器决定不继续的规则,即警告i