从 C 中的 X 宏列表中选择一项

问题描述 投票:0回答:1

我有一个像这样的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”宏的某种组合来解决我的问题

c++ c c-preprocessor x-macros
1个回答
0
投票

首先重构代码以将上下文传递给宏,这将简化维护和上下文。

#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才能再次使用它。

© www.soinside.com 2019 - 2024. All rights reserved.