如何通过传参单宏批量定义指定数量的唯一C变量?
用宏
TOTO(n)自动生成指定数量的唯一变量 你要的是无需手动列参数,靠__COUNTER__自动生成toto0、toto1…这类变量的宏,直接上可行方案:
基础实现(简单直接,按需扩展层级)
// 每次调用生成一个带自增后缀的变量 #define VAR() int toto##__COUNTER__ = 0; // 预定义不同次数的重复宏 #define REPEAT_0() #define REPEAT_1() VAR() #define REPEAT_2() REPEAT_1() VAR() #define REPEAT_3() REPEAT_2() VAR() #define REPEAT_4() REPEAT_3() VAR() // 要支持更多数量就继续追加,比如REPEAT_5() REPEAT_4() VAR() // 对外暴露的TOTO宏,把传入的数字映射到对应的重复宏 #define TOTO(n) REPEAT_##n()
使用示例
当你写TOTO(3)时,预处理器会直接展开为:
int toto0 = 0; int toto1 = 0; int toto2 = 0;
进阶递归版(接近“循环”逻辑)
如果不想手动逐个定义REPEAT_N,可以用递归递减的方式实现:
#define VAR() int toto##__COUNTER__ = 0; // 递归重复调用VAR(),直到n减到0停止 #define REPEAT(n) \ IF_GT(n,0)(VAR() REPEAT(DEC(n))) // 辅助宏:判断n是否大于0,大于则执行后续代码 #define IF_GT(n,val) IF_GT_##n##_##val #define IF_GT_0_0(...) #define IF_GT_1_0(...) __VA_ARGS__ #define IF_GT_2_0(...) __VA_ARGS__ #define IF_GT_3_0(...) __VA_ARGS__ // 需扩展到你需要支持的最大数值 // 辅助宏:实现n的递减操作 #define DEC(n) DEC_##n #define DEC_1 0 #define DEC_2 1 #define DEC_3 2 // 对应扩展到最大数值 #define TOTO(n) REPEAT(n)
关键注意点
__COUNTER__是GCC、Clang、MSVC等主流编译器都支持的预定义宏,每次被引用时自动递增,确保变量名唯一。- 两种方案都受编译器预处理器递归深度限制,默认支持几十层,足够日常场景使用;若需支持数百个变量,只需手动扩展对应宏的层级即可。
内容的提问来源于stack exchange,提问作者Vladouch
相关产品推荐
相关产品推荐

