Pertanyaan Saya menemukan beberapa kode aneh di kernel linux, bisakah seseorang menjelaskannya kepada saya?


Saya menemukan ini di initramfs.c, saya belum melihat sintaks ini sebelumnya, bisakah seseorang menjelaskan apa yang dilakukannya?

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,
};

Kode Sumber (baris 366): initramfs.c 


32
2018-02-11 00:35


asal


Jawaban:


Ini adalah inisialisasi array out-of-sequence dengan indeks. Ini seperti menulis

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

kecuali bahwa Anda dapat melakukannya sebagai penginisialisasi statis.


22
2018-02-11 00:39



Ini adalah fitur dari ISO C99 yang dikenal sebagai inisialisasi yang ditunjuk. Ini menciptakan larik dan menginisialisasi elemen spesifik dari larik tersebut, tidak harus N yang pertama dalam urutan. Ini setara dengan cuplikan berikut:

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;

Kecuali bahwa array hanya akan sebesar yang dibutuhkan (sama dalam ukuran untuk satu lebih dari indeks terbesar), dan itu dapat diinisialisasi secara statis pada lingkup global - Anda tidak dapat menjalankan kode di atas pada lingkup global.

Ini bukan fitur ANSI C89, tetapi GCC menyediakan fitur ini sebagai ekstensi bahkan ketika mengkompilasi kode sebagai C89.


18
2018-02-11 00:40



Desainer dalam Inisialisasi Array

Ekspresi tanda kurung disebut perancang, dan itu sintaks untuk menginisialisasi array atau struktur dengan memberi nama bidang atau elemen bukan hanya dengan memesan penginisialisasi dalam urutan yang sama dengan deklarasi.


3
2018-02-11 00:38