单行评论延续

时间:2015-05-25 12:17:31

标签: c++ comments

从C ++标准(至少回到C ++ 98)§2.2,注2说明:

删除反斜杠字符(\)后面紧跟一个换行符的每个实例,拼接物理源代码行以形成逻辑源代码行。只有任何物理源线上的最后反斜杠才有资格成为此类拼接的一部分。除了在原始字符串文字中恢复的拼接外,如果拼接导致字符序列与通用字符名称的语法匹配,则行为未定义。在任何此类拼接发生之前,源文件不是空的并且不以换行符结尾,或者以紧跟在反斜杠字符之前的新行字符结尾处理,应该像处理另外的新文件一样处理线条字符附加到文件。

并且,第2.7节说明:

字符/ *开始注释,以字符* /结尾。这些评论没有嵌套。字符//开始一个注释,它以下一个换行符结束。如果此类注释中有换页符或垂直制表符,则在它与终止注释的换行符之间只应出现空白字符;无需诊断。 [注意:注释字符//,/ *和* /在//注释中没有特殊含义,并且与其他字符一样对待。同样,注释字符//和/ *在/ *注释中没有特殊含义。 ]

我会将这两者结合起来表示以下内容:

// 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不符合标准的情况?

2 个答案:

答案 0 :(得分:3)

这不是合规问题。您已经特别要求编译器将有效构造视为错误,以便它能够做什么。

如果您指定-Wcomment-Wall,GCC将发出相同的警告(如果请求,则会出错)。

答案 1 :(得分:1)

我会说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中关闭THAT警告。

同样正如迈克所说:标准甚至没有涵盖警告 - 它只说明了什么是错误。如果启用“警告是错误”,则必须选择启用哪些警告,或者接受某些技术上有效(但可疑)的构造在构建中是不可接受的,因为编译器制造商已决定警告关于它。尝试在gcc或clang中编写if (c = getchar()),看看你得到了多少 - “高”的错误和警告。然而根据标准它完全有效。