X-Macro模式:编译期代码生成技术
请介绍 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 不识别宏展开内容、无类型检查。