C宏列表生成替代方案:无需重复F(元素)写法的实现方法
解决方案
你可以用可变参数宏实现逗号分隔的列表定义,不需要给每个元素套F(...)包装,以下是兼容C99及以上标准的实现方案:
第一步:定义通用批量遍历宏
这组宏只需定义一次,后续所有批量生成场景都可复用:
// 按实际需要的最大元素个数扩展,以下示例支持最多10个元素,可自行往后追加 #define FOREACH_ARG1(F, X) F(X) #define FOREACH_ARG2(F, X, ...) F(X) FOREACH_ARG1(F, __VA_ARGS__) #define FOREACH_ARG3(F, X, ...) F(X) FOREACH_ARG2(F, __VA_ARGS__) #define FOREACH_ARG4(F, X, ...) F(X) FOREACH_ARG3(F, __VA_ARGS__) #define FOREACH_ARG5(F, X, ...) F(X) FOREACH_ARG4(F, __VA_ARGS__) #define FOREACH_ARG6(F, X, ...) F(X) FOREACH_ARG5(F, __VA_ARGS__) #define FOREACH_ARG7(F, X, ...) F(X) FOREACH_ARG6(F, __VA_ARGS__) #define FOREACH_ARG8(F, X, ...) F(X) FOREACH_ARG7(F, __VA_ARGS__) #define FOREACH_ARG9(F, X, ...) F(X) FOREACH_ARG8(F, __VA_ARGS__) #define FOREACH_ARG10(F, X, ...) F(X) FOREACH_ARG9(F, __VA_ARGS__) // 参数计数调度,自动匹配对应参数个数的遍历逻辑 #define GET_FOREACH(_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,NAME,...) NAME #define FOREACH(F, ...) GET_FEREACH(__VA_ARGS__, \ FOREACH_ARG10,FOREACH_ARG9,FOREACH_ARG8,FOREACH_ARG7,FOREACH_ARG6,\ FOREACH_ARG5,FOREACH_ARG4,FOREACH_ARG3,FOREACH_ARG2,FOREACH_ARG1\ )(F, __VA_ARGS__)
第二步:实现你的需求
直接用逗号分隔定义函数名列表,一键生成所有目标函数:
#include <stdio.h> // 纯逗号分隔的函数名列表,增删元素直接修改此处即可 #define FUNCTION_LIST name, age, address // 单函数生成逻辑,注意原写法的#name是笔误,需要改为#X才能打印当前函数名 #define GEN_FUNCTION(X) void X() { printf(#X); } // 批量生成所有函数 FOREACH(GEN_FUNCTION, FUNCTION_LIST)
上述代码展开后和你给出的手写示例完全等价,代码可读性大幅提升,元素数量再多也不会臃肿。
拓展说明
- 如果需要支持更多元素,只需按照规则追加
FOREACH_ARG的定义即可,一般追加到30~50个就能覆盖绝大多数业务场景 - 该通用
FOREACH宏可复用在所有批量生成场景:比如生成枚举值、生成结构体字段、生成函数声明等,不用重复定义遍历逻辑
内容的提问来源于stack exchange,提问作者Giuppox
相关产品推荐
相关产品推荐

