Я нашел некоторый причудливый код в ядре 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

32
задан Seamus Connor 11 February 2010 в 00:35
поделиться

3 ответа

Это инициализация массива вне очереди по индексу. Это похоже на запись

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

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

22
ответ дан 27 November 2019 в 21:02
поделиться

Это функция из 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;

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

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

18
ответ дан 27 November 2019 в 21:02
поделиться

Указатели в инициализации массива

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

3
ответ дан 27 November 2019 в 21:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: