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

C语言中多行注释警告的含义是什么?,c,gcc,comments,warnings,C,Gcc,Comments,Warnings,我正在做一个C文件的家庭作业,我想如果我能让我的答案像这样清晰可见,可能会对评分员有所帮助: //**********|ANSWER|************\\ //blah blah blah, answering the //questions, etc etc 在使用gcc编译时发现,第一行末尾的反斜杠字符似乎触发了“多行注释”警告。当我移除它们时,警告消失了。所以我的问题有两个: a) 反斜杠字符的出现如何使其成为“多行注释”,以及 b) 为什么多行注释会成为一个问题?C(自1999

我正在做一个C文件的家庭作业,我想如果我能让我的答案像这样清晰可见,可能会对评分员有所帮助:

//**********|ANSWER|************\\
//blah blah blah, answering the
//questions, etc etc
在使用gcc编译时发现,第一行末尾的反斜杠字符似乎触发了“多行注释”警告。当我移除它们时,警告消失了。所以我的问题有两个:

a) 反斜杠字符的出现如何使其成为“多行注释”,以及
b) 为什么多行注释会成为一个问题?

C(自1999年标准以来)有两种注释形式

旧式注释由
/*
引入,以
*/
终止,可以跨越一行的一部分、一整行或多行

C++风格的注释由
/
引入,并在行尾终止

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

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

//**********|ANSWER|************\\
只需在行尾使用反斜杠以外的内容,例如:

//**********|ANSWER|************//
int i = 42;

// backslash+space: \ 
i++
// backslash and no space: \
i--
printf("%d\n", i);
尽管这可能会产生误导,因为它看起来几乎像一个老式的
/**/注释。你可以考虑更简单的事情:

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


这也将对其下方的行进行注释。如果你想在没有警告的情况下在同一行上完成这项工作,请尝试

/* // Bla \\ */

编译器只是告诉您,您可能无意中注释掉了下一行代码,方法是将上一行注释结尾为
\
,这是C中的一个行连续字符。这会导致第二行与第一行连接。这又使得
/
注释实际上注释掉了两个原始行。在您的情况下,这不是问题,因为下一行也是注释

但如果下一行不是注释,那么您可能会出现“奇怪的行为”:编译器会无缘无故地忽略第二行。由于某些语法突出显示代码编辑器没有检测到这种情况,并且没有突出显示下一行作为注释,因此这种情况通常会变得复杂

通常,出于这个特定的原因,滥用
\
字符作为代码级别不是一个好主意。只有当你真的必须使用它时,也就是说,只有当你真的想把几行缝成一行时,才使用它

a) 反斜杠字符的出现如何使其成为“多行注释”,以及

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

//**********|ANSWER|************\//blah blah blah, answering the
//questions, etc etc
现在它会在开始处看到
/
,并忽略行的其余部分

b) 为什么多行注释会成为一个问题呢

在您的示例中,这不是因为第二行是注释,但是如果您在第二行上写了一些有用的东西呢

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

另一个原因是,即使知道这一点,通常编辑器也不会显示空白,因此很容易忽略反斜杠可能是或不是行中的最后一个字符。例如:

//**********|ANSWER|************//
int i = 42;

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

将导致
43
,因为
i--
被注释掉了,但
i++
没有注释掉(因为反斜杠不是行中的最后一个字符,而是空格)。

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


禁止,此特定警告可使用
-Wno comment
选项执行。

尾随的数量无关。最后一个是“转义换行”(从而继续[now multi line]注释)——这发生在CPP级别。删除“blah blah”(保留一个或两个尾随)前面的
/
,程序仍应编译,警告与前面相同。啊,这很有意义。谢谢。非常感谢你指出这个选项!为什么
-Wno error=comment
不起作用呢?你是我的英雄,谢谢你指出了一个例子,说明这是多么危险+1