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

C语言中FOREACH_OMPD_STATE类函数宏的定义运行逻辑如何理解

代码机制说明

这是C/C++中非常经典的**X宏(高阶宏)**用法,作用是统一维护重复代码结构,避免多处修改带来的不一致问题。

你提出的疑问解答如下:

  • 定义里的多条macro(状态名, 状态值)不是给宏参数传值,而是预定义好的固定参数模板
  • 你需要将一个自定义的类函数宏作为参数传入FOREACH_OMPD_STATE,预处理器会逐行把macro替换为你传入的宏名,自动展开所有行生成对应代码

实际使用示例

示例1:批量生成枚举值

// 自定义生成枚举项的模板宏
#define GENERATE_OMPT_ENUM(name, value) name = value,

// 调用高阶宏批量生成枚举
enum ompt_state {
    FOREACH_OMPD_STATE(GENERATE_OMPT_ENUM)
};

// 用完后销毁临时宏避免命名冲突
#undef GENERATE_OMPT_ENUM

预处理器展开后得到的代码如下:

enum ompt_state {
    ompt_state_undefined = 0x102,
    ompt_state_work_serial = 0x000,
    ompt_state_work_parallel = 0x001,
    ompt_state_work_reduction = 0x002,
};

示例2:批量生成状态值与名称的映射表

// 自定义生成映射表项的模板宏
#define GENERATE_STATE_MAP(name, value) {value, #name},

const struct {
    int state_code;
    const char* state_name;
} ompt_state_map[] = {
    FOREACH_OMPD_STATE(GENERATE_STATE_MAP)
};

#undef GENERATE_STATE_MAP

这种写法的优势是所有OMPD状态的定义只需要在FOREACH_OMPD_STATE里维护一次,新增/修改/删除状态时,所有用到这些状态的代码会自动同步更新,不需要手动修改多处。

内容的提问来源于stack exchange,提问作者Ahmed Sayed

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 02:24:05