C语言中能否基于指定值多次调用#define定义的宏?
实现方案
这个需求可以实现,C标准预处理器没有原生循环语法,但可以通过预处理宏递归展开或者现成的预处理库完成,以下是两种常用实现方案:
方案1:使用Boost.Preprocessor库(推荐,无需自己写重复逻辑)
Boost.Preprocessor是纯头文件的预处理工具库,内置了重复生成逻辑,直接调用即可:
#include <stdio.h> // 引入Boost的重复宏头文件 #include <boost/preprocessor/repetition/repeat.hpp> // 定义单次迭代生成的代码片段,z是内部占位参数,i是当前迭代下标(从0开始),data是自定义透传参数 #define GEN_ITEM(z, i, data) , a[i] // 生成n次重复的参数序列,第一个参数就是你需要的重复次数 #define REPS_N(n) BOOST_PP_REPEAT(n, GEN_ITEM, ~) int main() { int a[5]; // 传入5次,生成, a[0], a[1], a[2], a[3], a[4] scanf("%d%d%d%d%d" REPS_N(5)); for (int i = 0; i < 5; i++) { printf("%d ", a[i]); } return 0; }
如果需要下标从1开始,只需要把GEN_ITEM里的a[i]改成a[i+1]即可。
方案2:手动实现轻量重复宏(零依赖)
如果不想引入外部依赖,可以自己写有限次数的递归宏,覆盖你常用的次数范围即可:
#include <stdio.h> // 按需定义到你需要的最大重复次数,比如最大支持20次就写到REP_20 #define REP_1(m) m(0) #define REP_2(m) REP_1(m) m(1) #define REP_3(m) REP_2(m) m(2) #define REP_4(m) REP_3(m) m(3) #define REP_5(m) REP_4(m) m(4) #define REPEAT(n, macro) REP_##n(macro) // 定义单次生成的参数片段 #define GEN_REP(i) , a[i] // 生成5次重复序列 #define REPS_5 REPEAT(5, GEN_REP) int main() { int a[5]; scanf("%d%d%d%d%d" REPS_5); return 0; }
注意事项
- 所有宏展开都在编译期完成,因此重复次数必须是编译期常量,不能传入运行时变量。
- 如果需要调整生成的参数格式,只需要修改单次生成的宏定义即可。
内容的提问来源于stack exchange,提问作者Luigi Chan
相关产品推荐
相关产品推荐

