2012-10-02 99 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

這個答案在我看來是正確的。另外兩個答案對我來說看起來很有意思。 這一個有可能發現真正的,很難找到的名稱衝突,這很容易做到。 –