【发布时间】: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