编译期计算与泛型
更新时间:2026-10-01。配合 30-preprocessor-advanced,本文讲用预处理和 _Generic 构建零运行时开销抽象。
一、编译期求值
enum 常量、静态断言 _Static_assert、sizeof 都在编译期完成;能用编译期决定的就不留运行时分支。
二、_Generic 与 X-Macro
_Generic(x, int: f_int, double: f_double) 依据首参类型选择表达式,实现类型安全的泛型接口。X-Macro 把数据集中成一个宏列表,多次 #include/展开生成枚举、名称表和处理逻辑,新增成员只改一处。

三、常见坑
- 宏参数不加括号/不用 do-while。
- 宏重复求值带副作用的参数。
- 宏难调试,能用 inline 就别用函数式宏。
小结
总结
不用 C++ 也能做零运行时开销的编译期抽象:用 enum 常量、_Static_assert、sizeof 等常量表达式把决定提前到编译期;用 C11 _Generic(x, int:..., double:...) 按首参类型选择表达式实现类型安全的泛型分派;用 X-Macro 把数据集中维护成一份宏列表、多次展开同时生成 enum/字符串名表/处理逻辑,新增成员只改一处、杜绝多处不同步;代价是宏的参数要加括号、用 do-while 包裹、警惕带副作用参数被重复求值且难调试,能用 inline 就别用函数式宏。