2012-10-02 20 views
7

linuxカーネルソースの中では、enumの中にenum要素の同じ名前を持つ定義もあります。 linux/rtnetlink.hの例:は内部enumを定義します

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

もう1つの推測:このマクロでは、他のコードを壊さずに列挙型のエントリの名前を変更できます。ユーザーがまだRTM_BASEを使用することができ

enum { 
     RTM_BASE  = 16, 
#define RTM_BASE  RTM_BASE 

enum { 
     RTM_BASE_NEW_NEW_NEW  = 16, 
#define RTM_BASE  RTM_BASE_NEW_NEW_NEW 

に変更します。

+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

これらの別のことは、古いコードが古い名前を継続することを可能にするだけでなく、列挙定数が変更されているかどうかをチェックし、それらが定義されているかどうかを確認することです。

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

はコンパイルされません。

+0

この回答は私の意見では正しいものです。他の2つの答えは、私にはむしろ工夫されています。 これは、実際に見つけにくい名前の衝突を明らかにする可能性があります。これはかなり簡単です。 –

関連する問題