我需要在一组宏中包含多行注释,以便其中一个宏启动注释块,另一个宏结束它,如下所示:
#define C_BEGIN /*
#define C_END */
... other macros
但果然,这种方法不起作用。
答案 0 :(得分:7)
您无法通过以下推理来执行此操作。我们假设 是可能的。
因此,您创建了一个用/*
替换自己的宏,并为*/
创建了另一个宏。那么会发生什么?首先,从代码中删除注释。之后,预处理器用注释替换您的宏。之后,编译器会窒息:它不知道如何处理/*
和*/
,因为它根本不会面对这样的事情:评论始终删除之前编译,所以它甚至不知道什么是“评论”。它可能会认为它是一个除法,然后是乘法。
所以我们的假设是错误的,你不能这样做。
答案 1 :(得分:4)
评论处理在宏扩展之前发生:
2.2翻译阶段[lex.phases]
1 - 翻译语法规则的优先顺序由以下阶段指定。 [...]
3. [...]每个评论由一个空格字符替换。 [...]
4.执行预处理指令,扩展宏调用[...]
也许您可以尝试两次预处理源文件? (注意:不要这样做。)
答案 2 :(得分:2)
但果然,这种方法不起作用。
它无法正常工作。您#define C_BEGIN
中的评论不属于您的宏定义,也不属于您的宏定义的一部分。就语言而言,#define C_END
不是宏定义。它只是该多行评论的一部分。换句话说,它是空白。在预处理器/编译器进入解释宏定义的阶段之前,将处理注释(变为空白)。
答案 3 :(得分:0)
如果您使用的是IDE,只需按 ctrl / for Windows或 command / on苹果电脑。您应该首先选择要评论的行。