提问人:JerSci 提问时间:4/23/2022 最后编辑:BarmarJerSci 更新时间:4/23/2022 访问量:69
如何从我的 X-macro 中挑选我想要的值?
How do i cherry pick which values I want from my X-macro?
问:
我有一个这样的 x-macro
#define LIST_OF_REGISTERS_R16 \
X(0x00, B) \
X(0x10, D) \
X(0x20, H) \
X(0x30, S)
我是这样定义的
#define X(id, name) name--;
LIST_OF_REGISTERS_R16
#undef X
问题是,在某些情况下,当我定义宏时,我有时需要选择或取消选择此列表的某些部分,例如我可能只需要(没有 S)或我可能需要(没有 H)。我可以为每个可能的组合定义一个 x 宏,但这样我就有 24 个 X 宏,只是为了某些场景,这是丑陋和浪费的。有什么帮助吗?B, D, H
B,D,S
答:
0赞
fabian
4/23/2022
#1
您可以使用 use an 语句。if
#define LIST_OF_REGISTERS_R16(X) \
X(0x00, B) \
X(0x10, D) \
X(0x20, H) \
X(0x30, S)
#define X(a, b) if constexpr (#b[0] == 'S') std::cout << a << '\n';
int main()
{
LIST_OF_REGISTERS_R16(X);
}
但是,如果您从列表中选择单个寄存器,恕我直言,最好为它们定义单独的宏。
#define REGISTER_R16_B(X) X(0x00, B)
#define REGISTER_R16_D(X) X(0x10, D)
#define REGISTER_R16_H(X) X(0x20, H)
#define REGISTER_R16_S(X) X(0x30, S)
#define LIST_OF_REGISTERS_R16(X) \
REGISTER_R16_B(X) \
REGISTER_R16_D(X) \
REGISTER_R16_H(X) \
REGISTER_R16_S(X)
#define X(a, b) std::cout << a << '\n';
int main()
{
REGISTER_R16_S(X);
}
上一个:迭代和比较不同大小的结构元素
评论
name--
B
D
H
S
#define X(id, name) case id: var_example = name--; break;