如何从我的 X-macro 中挑选我想要的值?

How do i cherry pick which values I want from my X-macro?

提问人:JerSci 提问时间:4/23/2022 最后编辑:BarmarJerSci 更新时间:4/23/2022 访问量:69

问:

我有一个这样的 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, HB,D,S

C++ C X-宏

评论

0赞 Barmar 4/23/2022
你能生成所有的组合而忽略你不需要的组合吗?
0赞 M Oehm 4/23/2022
嗯。您希望如何使用 X 宏?一个典型的用法是将 C 语言中作为独立概念的事物一起定义,例如枚举常量和字符串。根据我的经验,X 宏用于定义而不是代码。你的定义表明你心里有别的东西,也许是一个由四个元素组成的数组,你可以用常量 、 和 ?name--BDHS
0赞 JerSci 4/23/2022
@MOehm它实际上是用于赋值操作,所以它会是 ,并且在列表中,不仅仅是 B、D、H、S(大约 10 个),这就是为什么我不想为所有可能的组合生成宏。目标相当简单,因为我只需要执行一项任务,但问题是它不可维护且简单,这就是我尝试使用 X-macros 的原因#define X(id, name) case id: var_example = name--; break;
0赞 JerSci 4/23/2022
@Barmar这在我的代码中是不可行的,但我在上面的示例中提供的是最小的示例,但实际上列表包含 10 个,因此为所有这些更改生成一个完整的列表似乎很疯狂。我希望可能有一种简单的方法,可以针对特定场景/案例排除该列表中的一个元素

答:

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);
}