可以通过使用反斜杠(如多行宏)将样式注释继续到下一行吗? E.g。
// here is a comment \
and this is more comments \
const char* x = "hello"; // this line of "code" is actually still a comment
int x = 5; // and now an actual line of code
答案 0 :(得分:26)
是。由\
终止的行在翻译过程的早期与下一行拼接在一起。它发生在翻译的第2阶段,在删除注释之前和预处理器有机会完成其工作之前。
评论识别和删除发生在第3阶段。因此,您可以使用//
将\
评论转换为看似多行评论的内容。这通常会欺骗大多数语法高亮的源代码解析器。
预处理器在第4阶段工作。
这意味着您可以使用\
“多线化”几乎所有内容,包括注释和预处理器指令
#\
d\
e\
f\
i\
n\
e \
ABC \
int i
int main() {
A\
B\
C = 5;
}
P.S。请注意,终止\
不会在拼接线中引入任何空格。在使用\
功能编写多行注释时应考虑到这一点。例如,以下评论
// to\
get\
her
代表单词“together”而不代表三个单独的单词“to get her”。显然,在评论中错误地使用\
可能会大大模糊甚至扭曲其意图。
答案 1 :(得分:15)
这是不这样做的一个很好的理由。以下程序打印“这将出现”。
#include <iostream>
int main()
{
std::cout << "This "
// A comment ... \
<< "will appear"
// Another comment ... \
<< ", but this won't"
<< std::endl;
}
为什么呢?因为第一个\
后跟一个空格,所以它只是注释的一部分,不是一个行拼接字符。由于隐藏的尾随空白,程序的行为可能会悄然而显着地发生变化。
更好的理由不这样做:即使使用-pedantic
,g ++也会出错。当我使用g ++编译这个程序时,输出只是“这个”;忽略第一个\
后的尾随空格。在我看来,这是应该工作的方式,但它不是语言标准所说的。 (行拼接发生在翻译阶段2.我想有人可能会认为在第1阶段可以删除尾随空格,但我不相信这是一个有效的论据 - 我不知道gcc作者是否真的这个论点。)无论如何,g ++ 4.5.2和Sun CC版本5.5都不同意。
如果您需要多行注释,请使用/* ... */
,或在每行的开头插入//
。我更喜欢后者,因为更容易判断给定的行是注释的一部分。 (实际上它是多个单行注释。)任何体面的编辑器都应该让你这样做而不用N行输入//
N次。或者,如果您要注释掉一段代码,请使用#if 0 ... #endif
。
答案 2 :(得分:-3)
我原来说“不,你不能”。
但我仍然说“不,你不应该”!
使用/ * * /代替。
实施例
#include <stdio.h>
int main ()
{
// Begin comment \
continue comment?
return printf ("Hello world!\n");
}
上述编译,其他帖子中解释的原因。但它错了:
“//”是预期的(您应该使用“/ * * /”表示嵌套,对于多行注释
依靠“\”延续行是在程序中注入奇怪的,难以调试的错误的好方法。
就像在鼻子里吃串刺一样:即使你可以,也可能不应该。
... IMHO