C ++使用反斜杠的多行注释

时间:2011-08-14 20:34:35

标签: c++ comments

可以通过使用反斜杠(如多行宏)将样式注释继续到下一行吗? 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

3 个答案:

答案 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

相关问题