C中多行注释警告的含义是什么?

时间:2013-09-30 23:04:17

标签: c gcc comments warnings

我正在为一个家庭作业分配一个C文件,我认为如果我这样看到我的答案就可以帮助评分者:

//**********|ANSWER|************\\
//blah blah blah, answering the
//questions, etc etc

并且在使用gcc编译时发现第一行末尾的反斜杠字符似乎触发了“多行注释”警告。当我删除它们时,警告消失了。所以我的问题有两个:

a)反斜杠字符的存在究竟是如何使其成为“多行注释”,而且  b)为什么多行评论无论如何都会成为问题?

5 个答案:

答案 0 :(得分:19)

C(自1999年标准以来)有两种形式的评论。

旧式评论由/*引入,并由*/终止,可以跨越一行,一行或一行。

C ++ - 样式注释由//引入,并在行尾结束。

但是,行末尾的反斜杠会导致该行拼接到下一行。因此,您可以合法地使用//引入注释,在行尾添加反斜杠,并使注释跨越多个物理行(但只有一个逻辑 line)。

这就是你在第一行所做的事情:

//**********|ANSWER|************\\

只需在行尾使用反斜杠以外的内容,例如:

//**********|ANSWER|************//

虽然这甚至可能会产生误导,因为它几乎看起来像是旧式的/* .. */评论。您可能会考虑一些更简单的事情:

/////////// |ANSWER| ////////////

或:

/**********|ANSWER|************/

答案 1 :(得分:8)

编译器只是告诉您,您可能通过使用\结束前一个注释行而无意中注释掉下一行代码,这是C中的行继续符。这会导致第二行获得与第一个连接在一起。这反过来使//评论实际上注释掉两个原始行。在你的情况下,它不是问题,因为下一行也是一个注释。

但如果下一行不打算成为评论,那么你可能最终会遇到“奇怪的行为”:编译器忽略第二行没有明显的原因。由于一些语法高亮的代码编辑器未检测到这种情况并且未能将下一行突出显示为注释,因此情况通常很复杂。

通常,出于这个特定原因,将\字符滥用为代码级别并不是一个好主意。只有在你真的需要时才使用它,即只有你真的想要将几行拼接成一条线。

答案 2 :(得分:2)

  

a)反斜杠字符的存在究竟是如何使其成为“多行注释”,并且

作为行上最后一个字符的反斜杠意味着编译器应该忽略反斜杠换行符 - 它告诉编译器在检查注释之前执行此操作。所以它说在删除评论之前应该有效地查看

//**********|ANSWER|************\//blah blah blah, answering the
//questions, etc etc

它现在在开始时看到//并忽略该行的其余部分

  

b)为什么多行评论无论如何都会成为问题?

在你的例子中,它不是因为第二行是评论,但是如果你在第二行写了一些有用的东西怎么办?

好吧,因为你问了问题“a”,你很可能没有意识到编译器就是这样做的,如果你没有意识到你已经注释掉了一行代码,那么它很好编译器警告你。

另一个原因是即使已经知道这通常是编辑器不会明显地显示空白,因此很容易错过反斜杠可能是也可能不是该行的最后一个字符。例如:

int i = 42;

// backslash+space: \ 
i++
// backslash and no space: \
i--
printf("%d\n", i);

由于43被注释掉,i--会产生i++,但webDriver不是(因为反斜杠不是行中的最后一个字符,而是空格)。

答案 3 :(得分:1)

没人问,但这是谷歌的最佳答案,所以

禁止,可以使用-Wno-comment选项完成此特定警告。

答案 4 :(得分:0)

这也将评论它下面的一行。如果你想在没有警告的情况下在一条线上完成所有操作

/* // Bla \\ */