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

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)

  • +1.唯一(微小的)故障是它将`#`缩进一个空格.我相信一些较旧的预处理器不喜欢它,所以惯例是缩进命令(ifdef/endif/include ...),而不是`#`.无论如何,答案是正确的,而且非常有创意. (2认同)

Mar*_*tos 6

编辑:以下答案似乎只适用于早期版本cpp.它在4.2.1和4.3.2之间突破.gcc -Eg++ -E打破甚至更早.有关详细信息,请参阅注释


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

#define HASH() #

...

HASH()ifdef __cplusplus
class foo { };
HASH()endif
Run Code Online (Sandbox Code Playgroud)

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

  • 我在GCC的预处理器中遇到错误:"错误:'#'后面没有宏参数" (3认同)

Dan*_*ien 5

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

#define EMPTY
EMPTY#ifdef
Run Code Online (Sandbox Code Playgroud)

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

 #ifdef

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