【问题标题】:Macro generation depending on preprocessor conditionals宏生成取决于预处理器条件
【发布时间】:2017-01-31 18:52:46
【问题描述】:

我有类似以下的情况,我在一个带有宏的表中有条目:

#define FOR_MY_TYPES(apply) \
  apply(a, b, c) \
  apply(d, e, f) \
  ....

我还有一些预处理器条件:

#define CONDITION1 1
#define CONDITION2 0

我希望根据这些条件添加表中的一些条目,如下所示:

#define FOR_MY_TYPES(apply) \
    apply(a, b, c) \
    #if CONDITION1 || CONDITION2
    apply(x, y, z)
    #endif

实现这一点的最佳方法是只保留一个宏定义,并且如果可能的话,根据条件避免重复条目。我想避免这种情况:

#if CONDITION1
#define FOR_MY_TYPES(apply) \
   ....Full table here...
#endif
#if CONDITION2
#define FOR_MY_TYPES(apply) \
//Full table again + CONDITION2 types
#endif
#if CONDITION1 || CONDITION2
#define FOR_MY_TYPES(apply) \
//Full table again + CONDITION1 || CONDITION2 types
#endif

我的问题是组合比较多,所以尽量避免复制。它也更容易出错。

【问题讨论】:

  • 答案是否定的。在过去一周左右的时间里,还有一个关于这个场景的问题;这意味着可能还有其他重复的旧问题。
  • 而不是apply(x,y,z)APPLY_12(x,y,z),其中该宏在#if CONDITION1 || CONDITION2 中定义
  • 嗯...我想到的问题是Is it wrong to add preprocessor directives in a function-like macro,但情况略有不同——它是关于在参数列表中使用#ifdef 的宏调用,而不是在宏定义中本身和这里一样。我坚持我的评论,直接答案是“不”。 (除此之外,反斜杠是否继续存在宏定义行的问题。宏定义在哪里结束?)

标签: c++ c macros c-preprocessor code-generation


【解决方案1】:

一种可能的方法:

#if CONDITION1 || CONDITION2
#define really_apply(x) x
#else
#define really_apply(x)
#endif

#define FOR_MY_TYPES(apply) \
    apply(a, b, c) \
    really_apply(apply(x, y, z))

【讨论】:

  • 效果很好。我仍然需要为条件组合制作宏,但至少我可以保留一个表。我认为没有更好的办法。
猜你喜欢
  • 1970-01-01
  • 2018-01-03
  • 1970-01-01
  • 2014-04-02
  • 2014-11-27
  • 2020-09-18
  • 1970-01-01
  • 2015-04-15
相关资源
最近更新 更多