我需要在一组宏中包含多行注释,以便一个宏启动一个注释块,另一个宏结束它,如下所示:
#define C_BEGIN /*
#define C_END */
... other macros
但果然,这种方法行不通。
由于以下原因,您不能这样做。让我们假设这是可能的。
因此,您创建了一个用 替换自身的宏,/*
另一个用于替换*/
. 那会发生什么?首先,从代码中删除注释。之后,预处理器用注释替换你的宏。在那之后,编译器会窒息:它不知道该做什么,/*
因为*/
它根本不会遇到这样的事情:注释总是在编译之前被删除,所以它甚至不知道“注释”是什么。它可能会认为这是一个除法,然后是乘法。
所以我们的假设是错误的,你不能这样做。
注释处理发生在宏扩展之前:
2.2 翻译阶段 [lex.phases]
1 - 翻译语法规则的优先级由以下阶段指定。[...]
3. [...] 每条评论都替换为一个空格字符。[...]
4. 执行预处理指令,扩展宏调用 [...]
也许您可以尝试对源文件进行两次预处理?(注意:不要这样做。)
但果然,这种方法行不通。
它行不通。您的注释#define C_BEGIN
不是宏定义的一部分,也不能成为宏定义的一部分。就语言而言,您#define C_END
不是宏定义。它只是该多行注释的一部分。换句话说,它是空白。在预处理器/编译器进入解释宏定义的阶段之前处理注释(变成空格)。
如果您使用的是 IDE,您可以ctrl/在 Windows 或command/Mac 上简单地按一下。您应该首先选择要评论的行。