我正在研究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
....
}
定义看起来没用;他们的目的是什么?为什么只有一些项目有定义?
答案 0 :(得分:10)
作为Matthew Slattery mentioned in another answer,GCC手册有一个部分,即§3.10.5 Self-Referential Macros,描述了这些宏的可能用途。
当宏扩展为对自身的调用时,一种可能的用途是避免无限扩展,但这是一种沮丧的做法。另一个用途是定义预处理器宏和枚举:
如果要使用枚举定义数字常量,但是对于每个常量都使用“#ifdef”,则可以执行此操作。
所以这基本上是M.M在上述评论中所说的内容。
这似乎得到this patch确认:
<咆哮>为什么内核开发人员行为如此不一致?我很喜欢 更喜欢将枚举值添加为定义的接口 本身,以便于探测哪些功能可用 当前的标题集。
真正令人沮丧的部分是中的一些枚举值 设置了#define,其中一些没有。
答案 1 :(得分:1)
IPv4协议中使用的此宏提供了创建,删除或获取有关特定网络接口的信息的功能。请参阅man page。