单行注释延续(Single line comment continuation)

2019-10-23 04:47发布

从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

如果你有警告为启用错误(我做这些,),这将导致程序无法成功编译(无警告-AS-错误,它工作得很好)。 有什么在不允许单行注释延续,或者这是MSVC不符合标准的情况下的标准?

Answer 1:

我会说这是MS是这样的事实敏感,如果你这样做:

#define macro() \
    some stuff \
    // Intended as comment \
    more stuff

那么当您使用变得非常有趣的错误macro()中的代码。

或其他意外只是打字这样的评论:

// The files for foo-project are in c:\projects\foo\
int blah;

(为“未定义可变嗒嗒”奇怪的错误发生时)

我永远不会使用续行的单行注释,但如果你有一些很好的理由,只是把这一警告关闭在MSVC。

另外,作为迈克说:警告,甚至没有标准所涵盖 - 它只是说有什么需要是一个错误。 如果启用了“警告是错误的”,你将不得不要么是有选择性的关于启用什么样的提醒,或接受一些结构在技术上有效(但可疑的)会在构建不可接受的,因为编译器制造商已经决定警告关于它。 试着写if (c = getchar())在GCC或铿锵,看多远,你得多-Werror和“高”的警告得到。 然而,它按标准是完全有效的。



Answer 2:

这是不达标的问题。 你已经明确要求编译器把一个有效的构建作为一个错误,所以这是它做什么。

GCC会给出同样的警告(或错误,如果需要)如果指定-Wcomment-Wall



文章来源: Single line comment continuation
标签: c++ comments