使用反斜杠的多行注释

C++ Multi-line comments using backslash

本文关键字:多行注释      更新时间:2023-10-16

//样式注释可以像多行宏一样使用反斜杠延续到下一行吗?例如

// 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。出于这个原因,您可以使用//注释转换为看起来像多行注释的注释。这通常会骗过大多数语法高亮的源代码解析器。

预处理器在阶段4工作。

这都意味着您可以使用"多行"几乎任何东西,包括注释和预处理器指令

#
d
e
f
i
n
e 
ABC 
int i
int main() {
A
B
C = 5;
}

注:请注意,结束的不会在拼接行中引入任何空白。在使用特性编写多行注释时,应该考虑到这一点。例如,下面的注释

// to
get
her

代表一个单词"together",而不是三个单独的单词"together"。显然,在注释中不正确地使用可能会严重混淆甚至扭曲它们的预期含义。

这里有一个很好的理由这样做。下面的程序打印"This will appear"

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

为什么?因为第一个后面跟着一个空格,所以它只是注释的一部分,所以不是是行拼接字符。由于不可见的尾随空白,程序的行为可以悄然而显著地改变。

不这样做的一个更好的理由是:g++会出错,即使是-pedantic。当我用g++编译这个程序时,输出只是"this";忽略第一个后面的尾随空格。在我看来,这就是应该的工作方式,但这不是语言标准所规定的。(线拼接发生在翻译阶段2。我想有人可能会争辩说,末尾的空格可以在阶段1中删除,但我不相信这是一个有效的论点——我不知道gcc作者是否真的提出了这个论点。)无论如何,g++ 4.5.2和Sun CC 5.5都不一致。

如果您想要多行注释,要么使用/* ... */,要么在每行的开头插入//。我更喜欢后者,因为它更容易分辨出给定的一行是注释的一部分。(实际上是多个单行注释。)任何体面的编辑器都应该允许您在不为N行输入// N次的情况下完成此操作。或者,如果你要注释掉一段代码,使用#if 0 ... #endif

我本来说的是"不,你不能"

但我仍然说"不,你不应该"!

用/* */代替

的例子:

#include <stdio.h>
int main ()
{
  // Begin comment 
     continue comment?
  return printf ("Hello world!n");
}

上述编译,原因在其他帖子中解释过。但这是错误的:

  • "//"用于单行注释(你应该使用"/* */"来嵌套,对于多行注释

  • 依赖于""的延续行是在你的程序中注入奇怪的、难以调试的错误的好方法。

就像用鼻子吃豆子一样:即使你可以,你可能也不应该。

IMHO…