*参照元 [#v191128f] #backlinks *説明 [#e9165748] -パス: [[gcc-8.3/gcc/target-hooks-macros.h]] -FIXME: これは何? --HOOK_VECTOR_1() の定義により結果が全く違う。非常にわかりにくい。 --HOOK_VECTOR_1(), HOOKSTRUCT の定義により結果が全く違う。非常にわかりにくい。 ---[[gcc-8.3/gcc/HOOK_VECTOR1()]] ---[[gcc-8.3/gcc/HOOKSTRUCT()]] **引数 [#qb03cedb] -INIT_NAME -- -SNAME --構造体の名前 **返り値 [#e608fbe1] -なし、関数ではない **参考 [#r7f08caf] ** target.h の場合 [#z7072a92] HOOK_VECTOR は構造体の定義を宣言するために使われる。 /* The target structure. This holds all the backend hooks. */ #define DEFHOOKPOD(NAME, DOC, TYPE, INIT) TYPE NAME; #define DEFHOOK(NAME, DOC, TYPE, PARAMS, INIT) TYPE (* NAME) PARAMS; #define DEFHOOK_UNDOC DEFHOOK #define HOOKSTRUCT(FRAGMENT) FRAGMENT //★★★★(2) #include "target.def" HOOK_VECTOR_1 は未定義のまま target.def をインクルードする。 target.def #include "target-hooks-macros.h" #undef HOOK_TYPE #define HOOK_TYPE "Target Hook" HOOK_VECTOR (TARGET_INITIALIZER, gcc_target) target-hooks-macros.h /* HOOK_VECTOR: Start a struct declaration, which then gets its own initializer. HOOK_VECTOR_END: Close a struct declaration, providing a member declarator name for nested use. */ #ifndef HOOK_VECTOR_1 #define HOOK_VECTOR_1(NAME, FRAGMENT) HOOKSTRUCT (FRAGMENT) //★★★★(1) #endif となっているため、 HOOK_VECTOR (TARGET_INITIALIZER, gcc_target) ↓ 定義より HOOK_VECTOR_1(TARGET_INITIALIZER, struct gcc_target {) ↓ (1) より HOOKSTRUCT (struct gcc_target{) ↓ (2) より struct gcc_target { -target.h 版: [[gcc-8.3/gcc/HOOK_VECTOR1()(target)]] ** genhooks.c の場合 [#u5863d8c] HOOK_VECTOR は static struct hook_desc hook_array[] の 1要素を定義するために使われる。 #define HOOK_VECTOR_1(NAME, FRAGMENT) \ { 0, 0, #NAME, 0, 0, HOOK_TYPE }, //★★★★(1) //... #include "target.def" target.def #include "target-hooks-macros.h" #undef HOOK_TYPE #define HOOK_TYPE "Target Hook" HOOK_VECTOR (TARGET_INITIALIZER, gcc_target) となっているため、 HOOK_VECTOR (TARGET_INITIALIZER, gcc_target) ↓ 定義より HOOK_VECTOR_1(TARGET_INITIALIZER, struct gcc_target {) ↓ (1) より { 0, 0, "TARGET_INITIALIZER", 0, 0, HOOK_TYPE }, となる。target.def の周りはこのような構造体の定義になっているため、 struct hook_desc { const char *doc, *type, *name, *param, *init, *docname; }; static struct hook_desc hook_array[] = { //... #include "target.def" #include "c-family/c-target.def" #include "common/common-target.def" #undef DEFHOOK }; HOOK_VECTOR は hook_array の 1要素を定義するために使っている。 -genhooks.c 版: [[gcc-8.3/gcc/HOOK_VECTOR1()(genhooks)]] *実装 [#af1c8ee3] #define HOOK_VECTOR(INIT_NAME, SNAME) HOOK_VECTOR_1 (INIT_NAME, struct SNAME {) - --[[gcc-8.3/gcc/HOOK_VECTOR1()]] *コメント [#oc5d16d8]