CodeWalk

X-Macro模式:编译期代码生成技术

作者:我还是少年 · 2026-05-30 12:55

请介绍 C/C++ 中的 X-Macro 模式,它如何利用宏定义来避免代码重复(如枚举值与字符串的映射),给出一个包含 enum、switch-case、序列化函数的完整示例。

回答

我还是少年

X-Macro 是一种元编程技巧,通过定义宏列表然后多次展开来生成重复代码。

经典示例——枚举与字符串映射

// 1. 定义 X-Macro 列表
#define COLOR_LIST \
    X(RED,    "Red Color")   \
    X(GREEN,  "Green Color") \
    X(BLUE,   "Blue Color")  \
    X(YELLOW, "Yellow Color")

// 2. 生成枚举
enum class Color {
#define X(name, desc) name,
    COLOR_LIST
#undef X
    COUNT
};

// 3. 生成字符串映射
const char* color_to_string(Color c) {
    switch(c) {
#define X(name, desc) case Color::name: return desc;
        COLOR_LIST
#undef X
        default: return "Unknown";
    }
}

// 4. 生成序列化
std::ostream& operator<<(std::ostream& os, Color c) {
    return os << color_to_string(c);
}

优势:只维护 COLOR_LIST 一处定义,添加新枚举值自动同步到所有代码生成处。

应用场景

  • 协议字段定义(ID/名称/类型三元组)。
  • 命令行参数解析表。
  • 单元测试用例列表。
  • 平台检测宏展开。

陷阱:宏调试困难、IDE 不识别宏展开内容、无类型检查。