2016-09-23 16 views
4

私は、Linuxのヘッダーの1つ、<linux/rtnetlink.h>を読みながら私には奇妙な何かに出くわしました:私はここに、マクロの理由を理解するのに苦労を抱えているか、彼らはなるだろうどのような違いなぜ#列挙型の中に値を定義しますか?

/* RTnetlink multicast groups */ 
enum rtnetlink_groups { 
     RTNLGRP_NONE, 
#define RTNLGRP_NONE   RTNLGRP_NONE 
     RTNLGRP_LINK, 
#define RTNLGRP_LINK   RTNLGRP_LINK 
     RTNLGRP_NOTIFY, 
#define RTNLGRP_NOTIFY   RTNLGRP_NOTIFY 
     RTNLGRP_NEIGH, 
#define RTNLGRP_NEIGH   RTNLGRP_NEIGH 
     RTNLGRP_TC, 
#define RTNLGRP_TC    RTNLGRP_TC 
     RTNLGRP_IPV4_IFADDR, 
#define RTNLGRP_IPV4_IFADDR  RTNLGRP_IPV4_IFADDR 
/* ... etc, pattern continues ... */ 
}; 

。これは何の目的ですか?

+0

クラス内にありますか? – imreal

+0

誰かが 'enum'を定義に変換したい、またはその逆で、未使用の行を削除するのを忘れたようです。しかし、いいえ、私はそれがLinuxカーネルにあるとは思わないでしょう... –

+0

@JohnKugelman:それが私が考えることができる唯一の理由です。回答として投稿する必要があります。 (私がする前に) –

答えて

6

これは、定数をプリプロセッサに見えるようにします。 #ifdefを使用して、特定の定数が使用可能かどうかを確認できます。

+0

現在のLinuxソースでは、 '#if RTNLGRP ...'や '#ifdef RTNLGRP ... 'は出現していないようですが、これはほぼ確実に'#define'ディレクティブが意図しているものです。 –

+0

また、既に他のものに定義されていると失敗します。 – technosaurus

関連する問題