You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 20:39:02