在glibc头文件中定义值为自身的C宏有何作用?
为什么要把枚举常量定义为自身的宏?
先看你给出的这段来自Ubuntu 20.04系统头文件的代码:
enum __rusage_who { /* The calling process. */ RUSAGE_SELF = 0, #define RUSAGE_SELF RUSAGE_SELF /* All of its terminated child processes. */ RUSAGE_CHILDREN = -1 #define RUSAGE_CHILDREN RUSAGE_CHILDREN };
这种把枚举常量再用宏定义成自身的写法,核心是为了兼容与灵活性,具体原因如下:
兼容老旧C代码:在C89标准普及前,C语言还不支持枚举类型,这类系统常量都是靠
#define来定义的。后来标准支持枚举后,头文件改用枚举来实现强类型的常量(比宏更安全),但为了让那些依赖#define RUSAGE_SELF的旧代码不用修改就能正常编译,就保留了宏定义,相当于给旧代码留了个兼容接口。适配不同编译环境:宏的预处理特性比枚举更灵活,比如在不同平台、不同编译选项下,可以通过
#ifdef这类条件编译指令调整常量定义。如果只用枚举,调整起来就没这么方便。避免符号识别问题:在复杂的头文件包含场景或特定编译选项下,枚举常量可能因作用域等问题无法被正确识别,而宏是全局预处理符号,展开时机更早,能确保在代码任何位置都能被正确引用。
内容的提问来源于stack exchange,提问作者Jimm Chen
相关产品推荐
相关产品推荐

