Pregunta Encontré algún código extraño en el kernel de Linux, ¿podría alguien explicarme esto?


Encontré esto en initramfs.c, no he visto esta sintaxis antes, ¿podría alguien explicar lo que está haciendo?

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

Código fuente (línea 366): initramfs.c 


32
2018-02-11 00:35


origen


Respuestas:


Esta es una inicialización de matriz fuera de secuencia por índice. Es como escribir

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

excepto que puedes hacerlo como un inicializador estático.


22
2018-02-11 00:39



Esta es una característica de ISO C99 conocida como Inicializadores designados. Crea una matriz e inicializa elementos específicos de esa matriz, no necesariamente la primera N en orden. Es equivalente al siguiente fragmento:

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;

Excepto que la matriz solo será tan grande como sea necesario (igual en tamaño a uno más que el índice más grande) y se puede inicializar estáticamente en el ámbito global; no se puede ejecutar el código anterior en el alcance global.

Esta no es una característica de ANSI C89, pero GCC proporciona esta característica como una extensión incluso cuando compila código como C89.


18
2018-02-11 00:40



Designadores en una inicialización de matriz

Las expresiones entre corchetes se llaman designadores, y esa es la sintaxis para inicializar una matriz o estructura nombrando los campos o elementos en lugar de solo ordenar los inicializadores en la misma secuencia que la declaración.


3
2018-02-11 00:38