我要做的是拥有C预处理器输出#ifdef
,#else
和#endif
指令。也就是说,我想以某种方式“转义”一个指令,以便预处理器的输出包括指令是在输出上运行的预处理器。
是否可以“转义”CPP指令,以便预处理器输出它,以便如果CPP输出本身是预处理的,则转义指令的输出将是预处理程序指令?
答案 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 -E
和g++ -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预处理器的问题。