在C语言中,多行注释警告是什么意思?

27

我正在为一项作业任务编写C文件,我想如果我像这样展示我的答案,可能会对审阅者有所帮助:

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

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

a)这些反斜杠字符如何使其成为“多行注释”,
b)为什么多行注释会成为问题?


3
末尾有几个反斜杠并不重要。最后一个反斜杠是为了“转义换行符”(从而继续[现在是多行]注释)- 这在CPP级别上发生。从“blah blah”的前面删除//(留下一个或两个尾随的\),程序应该仍然可以编译,并出现与以前相同的警告。 - user2246674
5个回答

37
自1999年标准以来,C语言有两种注释形式。
旧式注释以/*开头,以*/结尾,可以跨越一部分行、一整行或多行。
C++风格的注释以//开头,直到该行结束为止。
但是,在行末加上反斜杠会导致该行与下一行合并成为一个物理行(但仅算作一行逻辑线),因此您可以在行末使用//来合法地添加注释,并使其跨越多个物理行。
这就是您在第一行所做的事情:
//**********|ANSWER|************\\

只需在行末使用除反斜杠以外的其他字符,例如:

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

虽然即使如此也有可能会存在误导,因为它几乎看起来像是旧式的 /* .. */ 注释。您可能考虑使用更简单的方式:

/////////// |ANSWER| ////////////
或:
/**********|ANSWER|************/

12
编译器仅告诉您,您可能通过使用C中的行续字符\结束上一条注释行而无意间注释掉了下一行代码。这会使第二行与第一行连接在一起,从而使//注释实际上注释掉了原始两行。在您的情况下问题不大,因为下一行也是注释。
但是,如果下一行不打算作为注释,则您可能会遇到“奇怪的行为”:编译器似乎无缘无故地忽略了第二行。某些语法突出显示的代码编辑器通常会使该情况变得更加复杂,并且无法将下一行视为注释进行突出显示。
一般来说,出于特定原因,不滥用\字符作为代码级别是一个好主意。只有当您确实需要将几行拼接在一起时才使用它。

9
没人问,但这是谷歌的最佳答案,因此:
禁止特定警告可使用-Wno-comment选项。

非常感谢您指出这个选项!为什么不能使用-Wno-error=comment呢? - Patrick
你是我的英雄。 - DaBooba

3

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);

由于i--被注释掉了,但是i++没有被注释掉(因为反斜杠不是行尾的最后一个字符,而是一个空格),所以这将导致结果为43


谢谢您指出这个可能存在危险的例子。+1 - DaBooba

0

这将同时注释掉下面的行。如果你想在一行上完成而不出现警告,请尝试

/* // Bla \\ */

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接