首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >宏相关宏

宏相关宏
EN

Stack Overflow用户
提问于 2011-02-07 23:35:15
回答 4查看 1.1K关注 0票数 5

你能做这样的事吗?

代码语言:javascript
复制
  #define F(x) \
    #ifdef DOUBLE \
      2*x \
    #else \
      x \
    #endif

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

作为对一些答案的回应,编辑了,我真的用它来做一些代码生成,在这些代码中,根据定义的位置,代码略有不同。由于包含某些文件的顺序以及需要定义相关宏的顺序,因此需要以这种方式将其转换为保理。我可能不得不这样做,但如果我不必把自己从这个角落里拆下来,我会很兴奋的!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-02-07 23:57:41

如果我们能限制这个问题,你就能做到这一点。具体来说,如果您可以保证DOUBLE

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

然后,您可以使用一种间接方法与令牌连接:

代码语言:javascript
复制
#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)

用法示例:

代码语言:javascript
复制
F(t)
#define DOUBLE
F(t)

预处理后的结果:

代码语言:javascript
复制
DOUBLE_NOT_DEFINED
DOUBLE_IS_DEFINED

如果DOUBLE (如果定义的话)被定义为扩展到单个已知令牌的宏,如果该令牌可以构成标识符的一部分(例如,TRUE1),则此方法也将有效。要处理这个问题,只需将F_IMPL_宏重命名为F_IMPL_{TOKEN} (例如,F_IMPL_TRUEF_IMPL_1)。

票数 9
EN

Stack Overflow用户

发布于 2011-02-07 23:39:42

有什么问题

代码语言:javascript
复制
#ifdef DOUBLE
  #define F(x) (2 * (x))
#else
  #define F(x) (x)
#endif
票数 13
EN

Stack Overflow用户

发布于 2011-02-07 23:40:39

为什么不反过来筑巢呢?

代码语言:javascript
复制
#ifdef DOUBLE
#define F(x) (2*(x))
#else
#define F(x) (x)
#endif 
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4927976

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档