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)
如果我们能够限制问题,你就可以做到这一点.具体来说,如果你可以保证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
(如果已定义)定义为扩展为单个已知令牌的宏,则该方法也将起作用,如果该令牌可以形成标识符的一部分(例如,TRUE
或1
).要处理此问题,您只需将F_IMPL_
宏重命名为F_IMPL_{TOKEN}
(例如,F_IMPL_TRUE
或F_IMPL_1
).