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

坎普拉的板条箱

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

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

核心转储

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

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

如果要使用枚举定义数字常量,则可以这样做,但是每个常量的'#ifdef'为true。

因此,这基本上就是MM在上述评论中所说的。

这个补丁似乎可以证实这一点

<rant>为什么内核开发人员的行为会如此不一致?我更喜欢将枚举值也作为定义添加到其自身的接口,以使其易于探查当前头标集中可用的功能。

真正令人沮丧的部分是此集合中某些枚举值具有#define,而有些则没有。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么要为具有相同名称的函数定义宏?

为什么只有在函数定义后定义宏后,宏和具有相同名称的函数才能起作用?

为什么要定义函数原型,然后定义具有相同名称的预处理器宏?

在函数中已经存在的宏中声明具有相同名称的变量时,为什么没有收到警告?

为什么Visual C ++不接受具有相同名称的通用和非通用接口?

为什么 git 为具有不同名称和位置的文件分配相同的哈希?

C中具有相同定义的相同名称结构

在C中具有相同名称的函数

Linux中具有相同名称的进程数[c]

在C中具有相同名称的extern和global变量

为什么鼠标悬停和移出不适用于所有具有相同名称的类?

为什么在使用动态类型和动态绑定时,两个具有相同名称(属于不同类)的方法应具有相同的原型?

为什么Visual Studio在bin文件夹中创建两个具有相同名称的DLL?

查找所有具有相同名称的目录并删除centos中的所有内容

Angular2 2路绑定中具有相同名称的自定义输入和输出

如何使用 C# 在 json 响应中迭代多个具有相同名称的子节点并断言正确的内容

从具有相同名称的库中包含具有相同名称的不同对象。

为什么静态导入具有相同名称的静态方法是合法的?

为什么我的json结果包含两个具有相同名称的部分?

为什么不能访问具有相同名称的父类属性?

为什么两个表不能具有相同名称的索引?

Specman为什么不能导入两个具有相同名称的文件?

为什么较少的特定重载接管了具有相同名称的更具体的覆盖方法?

具有相同名称的变量,但未使用局部作用域变量,为什么?

类方法和具有相同名称的变量,在C ++中而不在Java中编译错误?

具有相同名称的函数和对象的打字稿定义

删除不同子目录中具有相同名称的文件夹的内容

如何在具有相同名称和相同日期的对象数组中添加值

如何在Typescript中为具有相同名称的类和名称空间编写声明