Подтвердить что ты не робот

Я нашел какой-то причудливый код в ядре linux, может кто-нибудь объяснить это мне?

Я нашел это в initramfs.c, я раньше этого синтаксиса не видел, может кто-нибудь объяснить, что он делает?

static __initdata int (*actions[])(void) = {
  [Start]   = do_start,
  [Collect] = do_collect,
  [GotHeader] = do_header,
  [SkipIt]  = do_skip,
  [GotName] = do_name,
  [CopyFile]  = do_copy,
  [GotSymlink]  = do_symlink,
  [Reset]   = do_reset,
};

Исходный код (строка 366): initramfs.c

4b9b3361

Ответ 1

Это инициализация массива out-of-sequence по индексу. Это как писать

actions[Start] = do_start;
actions[Collect] = do_collect;

за исключением того, что вы можете сделать это как статический инициализатор.

Ответ 2

Это функция ISO C99, известная как назначенные инициализаторы. Он создает массив и инициализирует определенные элементы этого массива, не обязательно первый N в порядке. Это эквивалентно следующему фрагменту:

static __initdata int (*actions[SOME_SIZE])(void);
actions[Start]   = do_start;
actions[Collect] = do_collect;
actions[GotHeader] = do_header;
actions[SkipIt]  = do_skip;
actions[GotName] = do_name;
actions[CopyFile]  = do_copy;
actions[GotSymlink]  = do_symlink;
actions[Reset]   = do_reset;

За исключением того, что размер массива будет таким же большим, как это необходимо (равным по размеру более чем одному наибольшему индексу), и его можно инициализировать статически в глобальной области действия - вы не можете запустить вышеуказанный код на глобальном сфера.

Это не функция ANSI C89, но GCC предоставляет эту функцию в качестве расширения даже при компиляции кода как C89.

Ответ 3

Обозначения в инициализации массива

Выраженные в скобки выражения называются указателями и синтаксисом для инициализации массива или структуры путем присвоения имен полям или элементам, а не просто путем упорядочения инициализаторов в той же последовательности, что и декларация.