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

ggg*_*ggg 18 c++ comments

可以通过使用反斜杠(如多行宏)将样式注释继续到下一行吗?例如

// 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
Run Code Online (Sandbox Code Playgroud)

AnT*_*AnT 26

是.由a终止的\行在翻译过程的早期与下一行拼接在一起.它发生在翻译的第2阶段,在删除注释之前和预处理器有机会完成其工作之前.

注释识别和删除发生在第3阶段.因此,您可以使用//注释将注释转换为看起来像多行注释的注释\.这通常会欺骗大多数语法高亮的源代码解析器.

预处理器在第4阶段工作.

这意味着你可以使用\包括注释和预处理器指令在内的几乎任何东西"多线化"

#\
d\
e\
f\
i\
n\
e \
ABC \
int i

int main() {
A\
B\
C = 5;
}
Run Code Online (Sandbox Code Playgroud)

PS请注意,终止\不会在拼接线中引入任何空格.在使用该\功能编写多行注释时应考虑这一点.例如,以下评论

// to\
get\
her
Run Code Online (Sandbox Code Playgroud)

代表单词"在一起"而不是三个单独的单词"得到她".显然,\在评论中错误使用可能会大大模糊甚至扭曲其意图.

  • 谢谢,我花了大约一个小时试图找出为什么gcc和clang因为这个而无法找到声明. (5认同)
  • 但是请注意,它是在*trigraph翻译之后完成的,所以如果你想*非常讨厌,你可以用`?? /`而不是正常的反斜杠继续行... (5认同)

Kei*_*son 15

这是这样做的一个很好的理由.以下程序打印"这将出现".

#include <iostream>
int main()
{
    std::cout << "This "
    // A comment ... \ 
    << "will appear"
    // Another comment ... \
    << ", but this won't"
    << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

为什么?因为第一个\后跟一个空格,所以它只是注释的一部分,而不是一个行拼接字符.由于隐藏的尾随空白,程序的行为可以安静地显着改变.

一个更好的理由不这样做:g ++错误,即使有-pedantic.当我用g ++编译这个程序时,输出只是"这个"; 第一个后面的尾随空格\被忽略.在我看来,这是它应该如何工作,但它不是语言标准所说的.(行拼接发生在翻译阶段2.我想有人可能会认为在第1阶段可以删除尾随空格,但我不相信这是一个有效的论据 - 我不知道gcc作者是否真的提出这个论点.)无论如何,g ++ 4.5.2和Sun CC版本5.5都不同意.

如果您想要多行注释,请使用/* ... *///在每行的开头插入一个.我更喜欢后者,因为更容易判断给定的行是注释的一部分.(实际上它是多个单行注释.)任何体面的编辑器应该让你这样做而不用//N行键入N次.或者,如果您要注释掉一段代码,请使用#if 0 ... #endif.