有没有办法逃避C预处理器指令?

时间:2011-10-07 13:02:16

标签: c++ c escaping c-preprocessor

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

是否可以“转义”CPP指令,以便预处理器输出它,以便如果CPP输出本身是预处理的,则转义指令的输出将是预处理程序指令?

3 个答案:

答案 0 :(得分:10)

Marcelo Cantos's answer的一个轻微变体适用于GNU cpp 4.4.3:

#define HASH(x) x

...

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

答案 1 :(得分:6)

编辑:以下答案似乎仅适用于早期版本的cpp。它在4.2.1和4.3.2之间突破。 gcc -Eg++ -E提前解除。有关详细信息,请参阅注释。


这是一个似乎有用的技巧:

#define HASH() #

...

HASH()ifdef __cplusplus
class foo { };
HASH()endif

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

答案 2 :(得分:4)

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

#define EMPTY
EMPTY#ifdef

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

 #ifdef

出于某种原因,这种技术与Ilmari Karonen's solution具有相同的领先空间问题,但这可能不是现代标准符合C预处理器的问题。