【问题标题】:Macros and multi-line comments宏和多行注释
【发布时间】:2012-07-30 12:51:17
【问题描述】:

我需要在一组宏中包含多行 cmets,以便一个宏启动一个注释块,另一个宏结束它,如下所示:

#define C_BEGIN /*
#define C_END */
... other macros

但果然,这种方法行不通。

【问题讨论】:

  • 即使在宏被替换之前,注释也会被忽略。你为什么要这样做?
  • 为什么不直接使用 cmets 开始呢?
  • 你需要在哪里使用这个你不能使用条件编译的地方? msdn.microsoft.com/en-us/library/ew2hz0yd.aspx

标签: c++ macros


【解决方案1】:

由于以下原因,您不能这样做。让我们假设它可能的。

所以您创建了一个宏,用/* 替换自己,另一个用*/ 替换。那会发生什么?首先,从代码中删除 cmets。之后,预处理器用 cmets 替换你的宏。在那之后,编译器会窒息:它不知道如何处理/**/,因为它根本不会遇到这样的事情:cmets 在编译之前总是被删除,所以它甚至不知道什么是“评论”。它可能会认为这是一个除法,然后是乘法。

所以我们的假设是错误的,你不能这样做。

【讨论】:

  • 好吧,/* 可能是合法的。假设你有float a, *b;并且想做a / *b——在那种的情况下,这是合法的。 (不过,这根本不会使您的答案无效-它仍然不是评论,也不会被视为评论,如果您尝试在源代码中将其写为/*,您会得到一个未完成评论的错误)
【解决方案2】:

注释处理发生在宏展开之前:

2.2 翻译阶段 [lex.phases]

1 - 翻译语法规则的优先级由以下阶段指定。 [...]
3. [...] 每条评论都替换为一个空格字符。 [...]
4. 执行预处理指令,扩展宏调用 [...]

也许您可以尝试对源文件进行两次预处理? (注意:不要这样做。)

【讨论】:

    【解决方案3】:

    但果然,这种方法行不通。

    它不能工作。 #define C_BEGIN 中的注释不是宏定义的一部分,也不能成为宏定义的一部分。就语言而言,您的 #define C_END 不是宏定义。它只是该多行注释的一部分。换句话说,它是空白。在预处理器/编译器进入解释宏定义的阶段之前处理注释(变成空格)。

    【讨论】:

      【解决方案4】:

      如果您使用的是 IDE,您只需在 Windows 上按 ctrl/ 或在 Windows 上按 command/苹果电脑。您应该先选择要评论的行。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-04
        • 1970-01-01
        • 1970-01-01
        • 2014-01-15
        • 2010-10-13
        • 1970-01-01
        相关资源
        最近更新 更多