我正在为一项作业任务编写C文件,我想如果我像这样展示我的答案,可能会对审阅者有所帮助:
//**********|ANSWER|************\\
//blah blah blah, answering the
//questions, etc etc
在使用gcc编译时,我发现第一行末尾的反斜杠字符似乎会触发“多行注释”警告。当我删除它们时,警告消失了。所以我的问题有两个:
a)这些反斜杠字符如何使其成为“多行注释”,
b)为什么多行注释会成为问题?
/*
开头,以*/
结尾,可以跨越一部分行、一整行或多行。//
开头,直到该行结束为止。//
来合法地添加注释,并使其跨越多个物理行。//**********|ANSWER|************\\
只需在行末使用除反斜杠以外的其他字符,例如:
//**********|ANSWER|************//
虽然即使如此也有可能会存在误导,因为它几乎看起来像是旧式的 /* .. */
注释。您可能考虑使用更简单的方式:
/////////// |ANSWER| ////////////
或:/**********|ANSWER|************/
\
结束上一条注释行而无意间注释掉了下一行代码。这会使第二行与第一行连接在一起,从而使//
注释实际上注释掉了原始两行。在您的情况下问题不大,因为下一行也是注释。\
字符作为代码级别是一个好主意。只有当您确实需要将几行拼接在一起时才使用它。-Wno-comment
选项。-Wno-error=comment
呢? - Patricka) 背斜杠字符的存在如何使其成为“多行注释”,
在一行的末尾使用背斜杠字符意味着编译器应该忽略背斜杠和换行符 - 它告诉编译器在检查注释之前要这样做。因此,它表示在删除注释之前,编译器应该有效地查看。
//**********|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
。
这将同时注释掉下面的行。如果你想在一行上完成而不出现警告,请尝试
/* // Bla \\ */
//
(留下一个或两个尾随的\),程序应该仍然可以编译,并出现与以前相同的警告。 - user2246674