2012-10-02 95 views
7

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

,这是什么原因呢?我无法弄清楚这是如何使用的。

感谢

回答

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

+0

'RTM_BASE = RTM_BASE_NEW_NEW_NEW'也可以工作,没有定义。 –

5

有一件事我能想到的是,你可以通过宏观手段检查非常存在枚举的

#ifdef RTM_BASE 
int flag = RTMBASE; 
#else 
int flag = 0; 
#endif 

没有,如果这是发生了什么事的想法,虽然。

+0

是的,这正是我完成我的三明治后我要写的。这是我能看到的真正服务的唯一目的 –

+0

有用!但从源头上看,似乎并没有以这种方式使用定义。谢谢。 – MirkoBanchi

+1

在内核源代码中这样做没有任何意义,但它对于可能需要在多个内核版本上工作的用户空间应用程序是有意义的,其中功能可能存在或不存在。 –

3

这些#define引擎实现,除了让老代码继续旧名称的另一件事应该枚举常量名被改变,并检查它们是否定义,是为了防止其他代码来定义这些符号。

#include <linux/rtnetlink.h> 
// for some reason, the author thinks 
#define RTM_BASE 17.3f 
// is a good idea 

不会编译。

+0

这个答案在我看来是正确的。另外两个答案对我来说看起来很有意思。 这一个有可能发现真正的,很难找到的名称冲突,这很容易做到。 –