宏依赖宏

pyt*_*hor 5 c macros gcc c-preprocessor

有可能做这样的事情:

  #define F(x) \
    #ifdef DOUBLE \
      2*x \
    #else \
      x \
    #endif
Run Code Online (Sandbox Code Playgroud)

所以当我使用时F,它扩展到什么取决于宏是否DOUBLE被定义?我不这么认为,但我很有希望.GNU扩展很好.

编辑 为了回答一些答案,我实际上是用它来做一些代码生成,代码稍有不同,具体取决于它的定义位置.由于包含某些文件的顺序以及需要定义相关宏的位置,以此方式切换它需要一些因子.我可能不得不这样做,但如果我不必从这个角落重新点燃自己,我会很激动!

Dan*_*her 13

怎么了?

#ifdef DOUBLE
  #define F(x) (2 * (x))
#else
  #define F(x) (x)
#endif
Run Code Online (Sandbox Code Playgroud)


Jam*_*lis 8

如果我们能够限制问题,你就可以做到这一点.具体来说,如果你可以保证DOUBLE也是

  • 未定义为宏,或
  • 被定义为扩展为空令牌序列的宏(例如#define DOUBLE),

然后你可以使用带有标记连接的间接方法:

#define F_IMPL_(x)       DOUBLE_IS_DEFINED
#define F_IMPL_DOUBLE(x) DOUBLE_NOT_DEFINED

#define F_1(x, m) F_2(x, m)
#define F_2(x, m) F_IMPL_ ## m ( x )

#define F(x) F_1(x, DOUBLE)
Run Code Online (Sandbox Code Playgroud)

用法示例:

F(t)
#define DOUBLE
F(t)
Run Code Online (Sandbox Code Playgroud)

预处理后的结果:

DOUBLE_NOT_DEFINED
DOUBLE_IS_DEFINED
Run Code Online (Sandbox Code Playgroud)

如果DOUBLE(如果已定义)定义为扩展为单个已知令牌的宏,则该方法也将起作用,如果该令牌可以形成标识符的一部分(例如,TRUE1).要处理此问题,您只需将F_IMPL_宏重命名为F_IMPL_{TOKEN}(例如,F_IMPL_TRUEF_IMPL_1).