3

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

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

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

4

4 回答 4

8

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

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

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

于 2012-07-30T13:10:07.363 回答
4

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

2.2 翻译阶段 [lex.phases]

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

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

于 2012-07-30T13:21:21.500 回答
2

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

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

于 2012-07-30T13:06:24.513 回答
0

如果您使用的是 IDE,您可以ctrl/在 Windows 或command/Mac 上简单地按一下。您应该首先选择要评论的行。

于 2016-04-25T21:13:58.927 回答