17

誰かがこの関数の構文を説明してくれませんか? ここで、SYS_fork は定数で、sys_fork は関数です。

static int (*syscalls[])(void) = {
[SYS_fork]    sys_fork,
[SYS_exit]    sys_exit,
[SYS_wait]    sys_wait,
[SYS_pipe]    sys_pipe,
[SYS_read]    sys_read,
[SYS_kill]    sys_kill,
[SYS_exec]    sys_exec,
};

ありがとうございました!

4

2 に答える 2

28

指定された初期化子の使用に遭遇しました。これらは C99 に存在し、GCC 拡張機能としても利用でき、Linux カーネル コードで (とりわけ) 広く使用されています。

ドキュメントから:

ISO C99 では、[配列の] 要素を任意の順序で与えることができ、それらが適用される配列インデックスまたは構造フィールド名を指定できます。GNU C では、これを C90 モードでも拡張として許可しています。[...]

配列インデックスを指定するには、要素値の前に「[index] =」を記述します。例えば、

int a[6] = { [4] = 29, [2] = 15 };

次と同等です。

int a[6] = { 0, 0, 15, 0, 29, 0 };

[...]

GCC 2.5 以降は廃止されていますが、GCC がまだ受け入れている代替構文は、要素値の前に「[index]」を記述し、「=」を付けないことです。

平易な英語では、 は を受け取って返すsyscalls関数へのポインターの静的配列ですvoidint。配列インデックスは定数であり、関連する値は対応する関数アドレスです。

于 2014-09-24T17:53:33.610 に答える