Dan*_*ien 8 c c++ escaping c-preprocessor
我所试图做的是有C预处理器输出#ifdef,#else和#endif指令.也就是说,我想以某种方式"转义"一个指令,以便预处理器的输出包括指令是在输出上运行的预处理器.
是否可以"转义"CPP指令,以便预处理器输出它,以便如果CPP输出本身是预处理的,则转义指令的输出将是预处理程序指令?
Ilm*_*nen 10
在GNU cpp 4.4.3中,Marcelo Cantos的一个小答案对我有用:
#define HASH(x) x
...
HASH(#)ifdef __cplusplus
class foo { };
HASH(#)endif
Run Code Online (Sandbox Code Playgroud)
编辑:以下答案似乎只适用于早期版本cpp.它在4.2.1和4.3.2之间突破.gcc -E并g++ -E打破甚至更早.有关详细信息,请参阅注释
这是一个似乎有用的技巧:
#define HASH() #
...
HASH()ifdef __cplusplus
class foo { };
HASH()endif
Run Code Online (Sandbox Code Playgroud)
您必须cpp直接使用,因为编译器将尝试立即使用预处理器输出,并且不知道如何处理未处理的指令.
另一个似乎有效的技巧是:
#define EMPTY
EMPTY#ifdef
Run Code Online (Sandbox Code Playgroud)
使用 GCC 的预处理器(版本 4.5.2),我得到:
#ifdef
出于某种原因,该技术与Ilmari Karonen 的解决方案具有相同的主要空间问题,但这可能不是符合现代标准的 C 预处理器的问题。