用于将任意宏扩展一定次数的宏
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,或类似的东西
- 你不能对FUN做出假设。需要是通用的。不,这不适用于手动展开循环
- 纯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("%dn", 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++ 宏扩展(__VA_ARGS__项名称和值)
- 我可以转义(抑制)C预处理器宏扩展吗
- 警告 C6031 返回值在宏扩展中被忽略
- 带有 gcc 和 clang 的可变参数宏扩展的奇怪行为
- "__cplusplus"宏扩展到什么?
- 预处理器,在未定义时将宏扩展为无
- C++停止预处理器宏扩展
- 通过宏扩展调用方法
- 宏中的宏扩展
- 用于将任意宏扩展一定次数的宏
- 使用模板进行宏扩展
- C/C++中的宏扩展
- #在C++中定义宏扩展的行为
- 我可以在字符串化之前强制未定义的宏扩展吗?
- 如何逐步查看宏扩展
- 宏扩展中的语法错误
- C/C++防止宏内部的宏扩展
- 首先是模板实例化与宏扩展
- C 宏扩展时出错