为什么在C中定义具有相同名称和内容的宏?

Zab*_*ula 15 c macros c-preprocessor

我正在研究if_link.hLinux内核头文件,它包含这个枚举:

enum {
        IFLA_UNSPEC,
        IFLA_ADDRESS,
        IFLA_BROADCAST,
        IFLA_IFNAME,
        IFLA_MTU,
        IFLA_LINK,
        IFLA_QDISC,
        IFLA_STATS,
        IFLA_COST,
#define IFLA_COST IFLA_COST
        IFLA_PRIORITY,
#define IFLA_PRIORITY IFLA_PRIORITY
        IFLA_MASTER,
#define IFLA_MASTER IFLA_MASTER
....
}
Run Code Online (Sandbox Code Playgroud)

定义看起来没用; 他们的目的是什么?为什么只有一些项目定义了?

cor*_*ump 11

正如Matthew Slattery 在另一个答案中提到的那样,GCC手册有一节,即§3.10.5自引用宏,它描述了这些宏的可能用途.

一种可能的用途是当宏扩展为对自身的调用时避免无限扩展,但这是一种沮丧的做法.另一个用途是定义预处理器宏和枚举:

如果要使用枚举定义数字常量,但是对于每个常量都使用"#ifdef",则可以执行此操作.

所以这基本上是MM在上面评论中所说的.

这个补丁似乎证实了这一点:

<rant>为什么内核开发人员行为如此不一致?我更喜欢将枚举值作为自身的定义添加的接口,以便于探测当前标头集中可用的哪些功能.

真正令人沮丧的部分是这个集合中的一些枚举值有#defines,而其中一些没有.