我有一个像这样的x宏:
#define X_LIST \
X(1, "name 1") \
X(2, "name 2") \
...
X(n, "name n")
我需要创建另一个宏,以允许我从 x 宏中的一个特定 X 中选择第二个参数。
我希望,我有一些像这样的宏
#define SELECT_X_TEXT(nr)
//somewhere where should be used X_LIST maybe with some arguments
当我使用时:
SELECT_X_TEXT(2) //should expand to "name 2"
我在 C link 中找到了有关宏的提示和技巧,但尚未完全理解。我想,我可以使用“IF”“WHEN”“EQUAL”宏的某种组合来解决我的问题
首先重构代码以将上下文传递给宏,这将简化维护和上下文。
#define X_LIST(X) \
X(1, "name 1") \
X(2, "name 2") \
X(n, "name n")
然后您可以编写一个宏来扩展例如仅第二个元素:
#define X_PICK2_1(...)
#define X_PICK2_2(...) __VA_ARGS__
#define X_PICK2_3(...)
#define X_PICK2_4(...)
/* etc. */
#define X_PICK2_n(...)
#define X_PICK2(n, ...) X_PICK2##_##n(__VA_ARGS__)
之后您可以:
#define X_LIST(X) \
X(1, "name 1") \
X(2, "name 2") \
X(n, "name n")
#define X_PICK2_1(...)
#define X_PICK2_2(...) __VA_ARGS__
#define X_PICK2_3(...)
#define X_PICK2_4(...)
/* etc. */
#define X_PICK2_n(...)
#define X_PICK2(n, ...) X_PICK2##_##n(__VA_ARGS__)
const char *str = X_LIST(X_PICK2);
我希望,我有一些像这样的宏
当前的 X_LIST 不带参数并且取决于 global 状态是不可能的。你必须首先:
#define X X_PICK2
然后您必须
#undef
X才能再次使用它。