C Объяснение функции

Может кто-нибудь объяснить мне синтаксис этой функции? где 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,
};

Спасибо!

Ответы

Ответ 1

Вы только что столкнулись с использованием назначенных инициализаторов. Они существуют в 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 является статическим массивом указателя на функцию, принимающую void и возвращающую int. Индексы массива являются константами, и их связанное значение является соответствующим адресом функции.