26

我正在为家庭作业处理 C 文件,我认为如果我让我的答案可见,它可能会对评分者有所帮助:

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

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

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

4

5 回答 5

33

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

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

C++ 风格的注释由行尾引入//和终止。

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

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

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

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

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

尽管即使这样也可能具有误导性,因为它几乎看起来像是旧式/* .. */评论。您可能会考虑一些更简单的事情:

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

或者:

/**********|ANSWER|************/
于 2013-09-30T23:11:22.177 回答
12

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

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

\通常,出于这个特定原因,将字符滥用为代码级别并不是一个好主意。仅当您确实需要时才使用它,即仅当您真的想将多条线拼接成一条线时。

于 2013-10-01T00:36:30.437 回答
5

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

抑制,这个特定的警告可以用-Wno-comment选项来完成。

于 2018-01-17T12:06:03.380 回答
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);

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

于 2016-03-10T10:45:33.853 回答
0

这也将注释它下面的行。如果您想在没有警告的情况下在一行上完成所有操作,请尝试

/* // Bla \\ */
于 2013-09-30T23:12:11.157 回答