0

私は理解できず、どこにも答えを見つけることができなかったこのコードに出くわしました:

#define CMD_MAP(F)

F(READ, NETFN_SE, 0x01, 1) \
F(WRITE, NETFN_SE, 0x02, 8)



typedef enum {
#define CMD_ENUM(A, B, C, D) A ,
        CMD_MAP(CMD_ENUM)
} cmd_t;

ここでの構文のルールは何ですか? CMD_MAP(F) は、これらの引数を関数 F に渡すことを意味しますか?

4

1 に答える 1

1

マクロは、実際のコンパイルが開始される前に処理されます。これらは、プリプロセッサがテキスト (コード) を編集する方法のルールにすぎません。

CMD_MAP(foo)展開されfoo(READ, NETFN_SE, 0x01, 1) foo(WRITE, NETFN_SE, 0x02, 8)てからコンパイルされます。

バックスラッシュは、マクロが次の行に続くことをプリプロセッサに伝えるだけです。

/編集: マクロは、ドイツのように 'k' ではなく 'c' で記述されます ;)

/Edit2: マクロ関数の基本ガイド

マクロの基本的な構文は次のとおりです。

#define MAKRO_NAME(argument1, argument2, ...) <definition of replacement-text>

次の簡単な例を見てください。

#define GET_A(val) val.a

この背後にある原則は、マクロを「呼び出す」ときに、「val.a」の val が括弧内にあるものに置き換えられるということです。したがって、コードに次のように記述すると、次のようにint x = GET_A(someObject);展開 (プリコンパイル) されint x = someObject.a; ます。

#define GET_SOMEVAL(obj, val) obj.val

//...

int x = GET_SOMEVAL(myObject, myVal);

次のように展開されます。int x = myObject.myVal;

ご覧のとおり、これらは単なるテキスト ベースの置換であり、プリプロセッサは C++ の文法や構文について何も知りません。マクロは、関数呼び出しなどで何もする必要はありません。テキストを置き換えるだけで機能します。マクロにはもう少し (暗い) 魔法がありますが、これで十分です。

質問に戻る: プリプロセッサは、書き込み時に「F」を括弧内に入れるものに置き換えるだけですCMD_MAP(this here replaces F)

于 2013-06-24T18:30:14.307 に答える