7

Linuxカーネルソースの内部では、列挙型の内部に、同じ名前の列挙型要素の定義もあることがわかります。例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
...

これの理由は何ですか?これがどのように使われるのか理解できません。

ありがとう

4

3 に答える 3

5

私が考えることができることの1つは、マクロを使用して列挙型の存在そのものを確認できることです:

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

しかし、それが起こっているかどうかはわかりません。

于 2012-10-02T10:38:31.560 に答える
4

これらの s が達成するもう 1 つのこと#defineは、列挙定数名が変更された場合に古いコードが古い名前を継続できるようにし、それらが定義されているかどうかをチェックすることに加えて、他のコードがこれらのシンボルを定義するのを防ぐことです。

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

コンパイルしません。

于 2012-10-02T13:40:50.500 に答える
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

于 2012-10-02T11:45:35.453 に答える