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

时间:2017-02-18 13:01:51

标签: c macros c-preprocessor

我正在研究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
....
}

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

2 个答案:

答案 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