3

假设我有这样的宏 #define MY_MACRO(n) xxxxxxxxx // some code

然后我想多次使用它

MY_MACRO(0)
MY_MACRO(1)
MY_MACRO(2)
MY_MACRO(3)
...
MY_MACRO(100)

有更好的方法吗?(我必须使用宏)

4

3 回答 3

6

您可以使用迭代。您可以使用 boost 的预处理器库或编写自己的。祝后者好运……这很复杂。预处理器元编程是一项棘手的工作。

使用 boost 预处理器,您可以执行以下操作:

#define MY_MACRO_N(Z,N,D) MY_MACRO(N)

BOOST_PP_REPEAT(101, MY_MACRO_N, ~)
于 2012-05-10T16:10:58.773 回答
1

你可以这样做:

int i;
for (i = 0; i <= 100; i++)
    MY_MACRO(i);

通过使用此循环,可能会以( to )MY_MACRO(n)的当前值调用 101 次。i0100

于 2012-05-10T16:19:32.287 回答
0

忘记所有受过高等教育的 teoreticians批评家,他们只是说永远永远不敢使用宏!

宏确实是必要的邪恶。是的,有时还有其他选择,例如模板、多态和其他东西。但并非总是可以在没有宏用户的情况下摆脱重复。

而且,以我的拙见,宏是比无限次重写相同的东西更好的选择。

现在关于你的问题。如果您的宏计算为一个其参数可能是运行时参数的表达式 - 您可以使用循环。

如果您的宏需要编译时已知常量 - 您可以考虑使用模板(如果适用)。

如果您的宏需要一个数值常量的表达式- 没有其他选择。

我只能建议您不要实际重复您的宏 100 次,而是可以做一些技巧,例如:

#define MACRO_IX10(m, i) \
    m(i##0) \
    m(i##1) \
    m(i##2) \
    m(i##3) \
    m(i##4) \
    m(i##5) \
    m(i##6) \
    m(i##7) \
    m(i##8) \
    m(i##9)

#define MACRO_IX100(m) \
    MACRO_IX10(m, ) \
    MACRO_IX10(m, 1) \
    MACRO_IX10(m, 2) \
    MACRO_IX10(m, 3) \
    MACRO_IX10(m, 4) \
    MACRO_IX10(m, 5) \
    MACRO_IX10(m, 6) \
    MACRO_IX10(m, 7) \
    MACRO_IX10(m, 8) \
    MACRO_IX10(m, 9)

然后你可以这样做:

MACRO_IX100(MYMACRO)

这相当于使用适当的表达式调用您的宏 100 次。

于 2012-05-10T16:49:16.750 回答