32 votes

J'ai trouvé du code bizarre dans le noyau Linux, est-ce que quelqu'un pourrait me l'expliquer?

J'ai trouvé ceci dans initramfs.c, je n'ai jamais vu cette syntaxe auparavant, quelqu'un pourrait-il expliquer ce qu'il fait?

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

Code source (ligne 366): initramfs.c

22voto

Variable Length Coder Points 4193

Ceci est une initialisation de tableau hors séquence par index. C'est comme écrire

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

sauf que vous pouvez le faire en tant qu'initialiseur statique.

18voto

Adam Rosenfield Points 176408

C'est une caractéristique de la norme ISO C99 connu comme désigné initialiseurs. Il crée un tableau et initialise les éléments spécifiques de ce tableau, pas nécessairement le premier N dans l'ordre. C'est l'équivalent de l'extrait de code suivant:

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;

Sauf que le tableau ne sera aussi grand qu'il doit (de taille égale à un de plus que le plus grand index), et il peut être initialisé de manière statique à la portée globale -- vous ne pouvez pas exécuter le code ci-dessus à la portée globale.

Ce n'est pas une caractéristique de la norme ANSI C89, mais GCC fournit cette fonctionnalité comme une extension, même lors de la compilation de code C89.

3voto

DigitalRoss Points 80400

Indicateurs dans une initialisation de tableau

Les expressions entre crochets sont appelées des désignateurs . C'est la syntaxe pour initialiser un tableau ou une structure en nommant les champs ou les éléments plutôt qu'en ordonnant simplement les initialiseurs dans le même ordre que la déclaration.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X