是否有一种方法来逃避C预处理器指令

Is there a way to escape a C preprocessor directive?

本文关键字:逃避 预处理 指令 处理器 方法 一种 是否      更新时间:2023-10-16

我要做的是让C预处理器输出#ifdef, #else#endif指令。也就是说,我想以某种方式"转义"一个指令,以便预处理器的输出包括预处理器在输出上运行的指令。

是否有可能"转义"CPP指令,以便它由预处理器输出,这样转义指令的输出将是预处理器指令,如果CPP输出本身要预处理?

在GNU cpp 4.4.3上,Marcelo Cantos的回答对我有用:

#define HASH(x) x
...
HASH(#)ifdef __cplusplus
class foo { };
HASH(#)endif

EDIT:下面的答案似乎只适用于cpp的早期版本。它介于4.2.1和4.3.2之间。gcc -Eg++ -E更早地实现收支平衡。详情见注释


这里有一个似乎有效的技巧:

#define HASH() #
...
HASH()ifdef __cplusplus
class foo { };
HASH()endif

您必须直接使用cpp,因为编译器将尝试立即使用预处理器输出,并且不知道如何处理未处理的指令。

另一个似乎有效的技巧是:

#define EMPTY
EMPTY#ifdef

使用GCC的预处理器(版本4.5.2),我得到:

<>之前# ifdef之前

由于某种原因,该技术与Ilmari Karonen的解决方案有相同的前置空间问题,但这可能不是符合现代标准的C预处理器的问题。