用于将任意宏扩展一定次数的宏?
A macro for expanding an arbitrary macro a certain number of times?
我想编写 C 宏,它采用整数文字或类似于整数文字的东西,以及另一个宏的名称,并将另一个宏扩展为整数文字的值的次数,索引作为参数,例如
MAGIC(4, FUN)
扩展到
FUN(0) FUN(1) FUN(2) FUN(3)
相反,如果我有 MORE_MAGIC 接受范围开始和长度,那会更好:
例如
MORE_MAGIC(1, 3, FUN)
扩展到
FUN(1) FUN(2) FUN(3)
注:
- 我可以忍受扩展的数量被限制在,我不知道,99 或 50,或类似的东西。
- 你不能对乐趣做出假设。需要是通用的。不,这不是为了手动展开 for 循环。
- 只有 C 的解决方案以及需要 C++ 的解决方案是最受欢迎的(例如,如果您以某种方式在解决方案中使用模板)。
- 解决方案的总行数(包括#include 但不包括注释)最好不要太长。说,不超过200。
Boost 预处理器是一个内容丰富的库,专注于这种预处理器魔法。
它提供了一个名为 BOOST_PP_REPEAT_FROM_TO 的宏,它完全可以满足您的需求。
此处提供完整参考:
http://boost.org/libs/preprocessor
您想要的基本上是一个展开的 for 循环...但您没有说明为什么要这样做。您可以制作一个创建 for 循环的宏,并相信编译器会决定它是否值得展开。
#include <stdio.h>
#define PRINT_INT(i) printf("%d\n", i);
#define MORE_MAGIC(start, end, function) for(int i = start; i <= end; i++) { function(i); }
#define MAGIC(end, function) MORE_MAGIC(0, end, function)
int main() {
puts("MAGIC!");
MAGIC(3, PRINT_INT);
puts("MORE_MAGIC!");
MORE_MAGIC(2, 6, PRINT_INT);
return 0;
}
我想编写 C 宏,它采用整数文字或类似于整数文字的东西,以及另一个宏的名称,并将另一个宏扩展为整数文字的值的次数,索引作为参数,例如
MAGIC(4, FUN)
扩展到
FUN(0) FUN(1) FUN(2) FUN(3)
相反,如果我有 MORE_MAGIC 接受范围开始和长度,那会更好:
例如
MORE_MAGIC(1, 3, FUN)
扩展到
FUN(1) FUN(2) FUN(3)
注:
- 我可以忍受扩展的数量被限制在,我不知道,99 或 50,或类似的东西。
- 你不能对乐趣做出假设。需要是通用的。不,这不是为了手动展开 for 循环。
- 只有 C 的解决方案以及需要 C++ 的解决方案是最受欢迎的(例如,如果您以某种方式在解决方案中使用模板)。
- 解决方案的总行数(包括#include 但不包括注释)最好不要太长。说,不超过200。
Boost 预处理器是一个内容丰富的库,专注于这种预处理器魔法。
它提供了一个名为 BOOST_PP_REPEAT_FROM_TO 的宏,它完全可以满足您的需求。
此处提供完整参考:
http://boost.org/libs/preprocessor
您想要的基本上是一个展开的 for 循环...但您没有说明为什么要这样做。您可以制作一个创建 for 循环的宏,并相信编译器会决定它是否值得展开。
#include <stdio.h>
#define PRINT_INT(i) printf("%d\n", i);
#define MORE_MAGIC(start, end, function) for(int i = start; i <= end; i++) { function(i); }
#define MAGIC(end, function) MORE_MAGIC(0, end, function)
int main() {
puts("MAGIC!");
MAGIC(3, PRINT_INT);
puts("MORE_MAGIC!");
MORE_MAGIC(2, 6, PRINT_INT);
return 0;
}