【发布时间】:2015-08-06 22:14:44
【问题描述】:
根据 C++ 标准(至少可以追溯到 C++98)§ 2.2,注 2 状态:
每个反斜杠字符 (\) 的实例后面紧跟一个换行符被删除,拼接物理源代码行以形成逻辑源代码行。只有任何物理源行上的最后一个反斜杠才有资格成为此类接头的一部分。除了在原始字符串文字中恢复的拼接外,如果拼接产生的字符序列与通用字符名称的语法匹配,则行为是未定义的。如果源文件不为空且不以换行符结尾,或者在任何此类拼接发生之前以换行符结尾且紧接反斜杠字符结尾,则应将其视为附加的 new-行字符被附加到文件中。
并且,第 2.7 节规定:
字符 /* 开始一个注释,它以字符 */ 结束。这些 cmets 不筑巢。字符 // 开始一个注释,它以下一个换行符结束。如果此类注释中有换页符或垂直制表符,则它与终止注释的换行符之间只能出现空白字符;不需要诊断。 [注意:注释字符 //、/* 和 */ 在 // 注释中没有特殊含义,它们的处理方式与其他字符一样。同样,注释字符 // 和 /* 在 /* 注释中没有特殊含义。 ]
我将这两者放在一起表示以下意思:
// My comment \
is valid
// My comment \ still valid \
is valid
在 C++98 中是合法的。在 GCC 4.9.2 中,它们都在没有任何诊断消息的情况下编译。在 MSVC 2013 中,这些都产生以下结果:
warning C4010: single-line comment contains line-continuation character
如果您启用了作为错误的警告(我确实这样做了),这会导致程序无法成功编译(没有警告作为错误,它工作得很好)。标准中是否存在不允许单行注释延续的内容,或者这是 MSVC 不符合标准的情况?
【问题讨论】: