假设我有一个像这样的宏
#define MY_MACRO(n) xxxxxxxxx // some code
然后我想多次使用它
MY_MACRO(0)
MY_MACRO(1)
MY_MACRO(2)
MY_MACRO(3)
...
MY_MACRO(100)
有更好的方法吗? (我必须使用宏)
答案 0 :(得分:6)
您可以使用迭代。您可以使用boost的预处理器库或编写自己的库。祝后者好运......这太复杂了。预处理器元编程是一项棘手的工作。
使用boost预处理器你可以这样做:
#define MY_MACRO_N(Z,N,D) MY_MACRO(N)
BOOST_PP_REPEAT(101, MY_MACRO_N, ~)
答案 1 :(得分:1)
您可以这样做:
int i;
for (i = 0; i <= 100; i++)
MY_MACRO(i);
使用此循环MY_MACRO(n)
将被调用101次,当前值为i
(0
至100
)。
答案 2 :(得分: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次。