你能做这样的事吗?
#define F(x) \
#ifdef DOUBLE \
2*x \
#else \
x \
#endif所以当我使用F时,它扩展到什么取决于是否定义了宏DOUBLE?我不这么认为,但我很有希望。GNU扩展很好。
作为对一些答案的回应,编辑了,我真的用它来做一些代码生成,在这些代码中,根据定义的位置,代码略有不同。由于包含某些文件的顺序以及需要定义相关宏的顺序,因此需要以这种方式将其转换为保理。我可能不得不这样做,但如果我不必把自己从这个角落里拆下来,我会很兴奋的!
发布于 2011-02-07 23:57:41
如果我们能限制这个问题,你就能做到这一点。具体来说,如果您可以保证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)用法示例:
F(t)
#define DOUBLE
F(t)预处理后的结果:
DOUBLE_NOT_DEFINED
DOUBLE_IS_DEFINED如果DOUBLE (如果定义的话)被定义为扩展到单个已知令牌的宏,如果该令牌可以构成标识符的一部分(例如,TRUE或1),则此方法也将有效。要处理这个问题,只需将F_IMPL_宏重命名为F_IMPL_{TOKEN} (例如,F_IMPL_TRUE或F_IMPL_1)。
发布于 2011-02-07 23:39:42
有什么问题
#ifdef DOUBLE
#define F(x) (2 * (x))
#else
#define F(x) (x)
#endif发布于 2011-02-07 23:40:39
为什么不反过来筑巢呢?
#ifdef DOUBLE
#define F(x) (2*(x))
#else
#define F(x) (x)
#endif https://stackoverflow.com/questions/4927976
复制相似问题