在Linux内核源代码中,我看到,在枚举内部,还有一个与enum元素名称相同的定义。我们在linux/rtnetlink.h
中的示例:
enum {
RTM_BASE = 16,
#define RTM_BASE RTM_BASE
RTM_NEWLINK = 16,
#define RTM_NEWLINK RTM_NEWLINK
RTM_DELLINK,
#define RTM_DELLINK RTM_DELLINK
...
这是什么原因?我无法弄清楚这是如何使用的。
由于
答案 0 :(得分:5)
我能想到的一件事是你可以通过宏来检查枚举的存在:
#ifdef RTM_BASE
int flag = RTMBASE;
#else
int flag = 0;
#endif
不知道这是不是正在发生的事情。
答案 1 :(得分:3)
这些#define
实现的另一件事,除了允许旧代码继续旧名称之外,应该更改枚举常量名称,并检查它们是否已定义,是为了防止其他代码定义这些符号。
#include <linux/rtnetlink.h>
// for some reason, the author thinks
#define RTM_BASE 17.3f
// is a good idea
不会编译。
答案 2 :(得分:2)
另一个猜测:这个宏可以允许在不破坏其他代码的情况下重命名枚举的条目。变化
enum {
RTM_BASE = 16,
#define RTM_BASE RTM_BASE
到
enum {
RTM_BASE_NEW_NEW_NEW = 16,
#define RTM_BASE RTM_BASE_NEW_NEW_NEW
用户仍然可以使用RTM_BASE
。