43 votes

Qu'est-ce que la syntaxe d'initialisation de structure marquée?

 struct file_operations scull_fops = {
.owner = THIS_MODULE,
.llseek = scull_llseek,
.read = scull_read,
.write = scull_write,
.ioctl = scull_ioctl,
.open = scull_open,
.release = scull_release,
};
 

Cette déclaration utilise la norme C initialisation de la structure marquée syntaxe.

Quelqu'un peut-il élaborer?

79voto

AndreyT Points 139512

Lorsque vous utiliser l'ensemble des initialiseurs (initialiseurs en {}) dans le "traditionnel" de la norme ANSI du langage C (C89/90), vous devez fournir un individu initialiseur pour chaque structure membre, dans l'ordre, en commençant par le premier. Par exemple

struct S { int a, b, c, d; };

struct S s = { 1, 2, 3, 4 };
/* 1 for `s.a`, 2 for `s.b` and so on... */

Vous n'êtes pas obligé de spécifier les initialiseurs pour tous les membres, c'est à dire que vous pouvez arrêter à tout moment (membres restants seront remis à zéro). Si pour quelque raison vous ne vouliez explicitement initialiser le troisième membre de la structure, vous n'avez pas eu d'autres choix que de fournir un "dummy" explicite de l'initialiseur de la première et de la deuxième membres (juste pour arriver à ce troisième)

/* We only care to explicitly initialize `s.c` */
struct S s = { 0, 0, 3 };
/* and we have no choice but to explicitly initialize `s.a` and `s.b` as well */

La nouvelle spécification de langage C (C99) permet d'utiliser les "tagged" les initialiseurs en fournissant le membre désiré nom au sein de la {}

struct S s = { .c = 3 };

De cette façon, vous ne explicitement initialiser le membre désiré(s) (et de demander au compilateur de façon implicite zéro-initialiser le reste).

Ce n'est pas seulement vous permet d'économiser un peu de temps, mais rend également le total des initialiseurs indépendant de l'ordre dans lequel les membres sont déclarées dans la structure.

Agrégation des initialiseurs, comme vous le savez probablement, peut être utilisé avec les tableaux, trop. Et C99 prend en charge "marqué" initialisation de tableaux ainsi. Comment les "balises" look dans le cas d'un tableau est illustré par l'exemple suivant

int a[10] = { [5] = 3 };

Il est intéressant de noter une fois de plus qu'en langage C qui continue à coller à l' "tout ou rien" approche globale de l'initialisation: si vous spécifiez explicitement un initialiseur pour juste une (ou plusieurs) membres d'une structure ou un tableau, l'ensemble de l'agrégat (struct ou un tableau) est initialisé, et les membres sans autorisation explicite des initialiseurs d'obtenir initialisé à zéro.

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