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

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

 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 .... } 

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

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

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

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

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

这个贴片似乎证实了这一点 :

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

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

IPv4协议中使用的此宏提供了创建,删除或获取有关特定网络接口的信息的function。 请参见手册页 。