【问题标题】:C++ Multi-line comments using backslash使用反斜杠的 C++ 多行注释
【发布时间】:2011-10-26 22:28:28
【问题描述】:

是否可以通过使用反斜杠将 // 样式 cmets 延续到下一行,例如多行宏?例如

// 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

【问题讨论】:

  • 我知道您已经有了答案,但同样好的答案是“您尝试时发生了什么?”
  • 答案是语言允许,但请不要这样做。许多编辑不会选择它,他们不会将下一行作为注释突出显示,您和其他人会阅读代码并期望下一行被执行...如果只是为了好玩,请尝试以 @ 结束单个注释行987654322@,类似:// What's this ??/
  • 不要这样做。我什至不想知道你是否可以。这听起来像是我所见过的最邪恶的事情。
  • @hobbs:(是的,这是一条旧评论。)“你尝试它时发生了什么”并不一定能回答这个问题。看我的回答;在某些情况下 g++ 恕我直言会出错。

标签: c++ comments


【解决方案1】:

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

评论识别和删除发生在第 3 阶段。因此,您可以使用 \// 评论变成看起来像多行评论的内容。这通常会欺骗大多数语法高亮源代码解析器。

预处理器在阶段 4 工作。

这意味着您几乎可以使用\“多行”任何东西,包括 cmets 和预处理器指令

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

int main() {
A\
B\
C = 5;
}

附:请注意,终止 \ 不会在拼接行中引入任何空格。在使用 \ 功能编写多行 cmets 时应考虑到这一点。比如下面的评论

// to\
get\
her

代表单个单词“together”而不是三个单独的单词“to get her”。显然,在 cmets 中错误使用 \ 可能会严重混淆甚至扭曲其预期含义。

【讨论】:

  • 谢谢,我只花了大约一个小时试图弄清楚为什么 gcc 和 clang 都因此找不到声明。
  • 你可以使用这种多阶段机制来制作可选的cmets:- #define optional_comment /##/ optional_comment 这也是一个注释。
  • 但是请注意,它是在 三元组翻译之后完成的,所以如果你想真的 讨厌,你可以继续使用@987654330 @ 而不是普通的反斜杠...
  • 你可以用预处理器做任何事情。包括使 C/C++ 看起来像 BASIC 或 Pascal。但这并不意味着你应该。像这样扩展 cmets 是愚蠢的、低效的和彻头彻尾的危险。请不要在生产环境中做这样的事情!!!!!!!!!!!!
  • @paulsm4:这很好,但首先这不是预处理器功能。预处理器功能不会影响 cmets,因为在预处理器有机会做任何事情之前, cmets 已从翻译单元中删除。
【解决方案2】:

这是一个很好的理由这样做。下面的程序打印出“这将出现”。

#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 版彼此不同意。

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

【讨论】:

  • 此外,一些 IDE(如我刚刚测试过的 Eclipse)只是在您保存源文件时修剪尾随空格
【解决方案3】:

我最初说“不,你不能”。

但我还是说“不,你不应该”!

使用 /* */ 代替。

示例:

#include <stdio.h>

int main ()
{
  // Begin comment \
     continue comment?
  return printf ("Hello world!\n");
}

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

  • “//”适用于单行 cmets(对于嵌套和多行 cmets,您应该使用“/* */”

  • 依靠“\”续行是在程序中注入怪异、难以调试的错误的好方法。

就像通过鼻子吃四季豆一样:即使可以,也可能不应该。

恕我直言...

【讨论】:

  • 这是一个有效的意见,但它并不能真正回答所问的问题。
  • /*...*/ cmets 不嵌套。
  • @KT: /* */ cmets 不嵌套 - 它们允许您在一行代码中嵌套注释。 AndreyT:“// 是为了……”是一个错字。我删除了该行
  • @paulsm4:“@KT”没有通知我; “@Keith”会。仅供参考。
  • /*...*/ cmets 不会嵌套,因为你不能这样做 /* hi /* there */ pal */
猜你喜欢
  • 2014-06-28
  • 2015-07-28
  • 2015-11-02
  • 2016-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-11
相关资源
最近更新 更多