Définition de la structure étrange

Dans l’exemple de code d’Intel DPDK, j’ai trouvé cette construction syntaxique étrange. Quelqu’un peut-il m’expliquer ce que cela signifie?

static const struct rte_eth_conf port_conf = { .rxmode = { .split_hdr_size = 0, .header_split = 0, .hw_ip_checksum = 0, .hw_vlan_filter = 0, .jumbo_frame = 0, .hw_ssortingp_crc = 0, }, .txmode = { } }; 

Si tu as

 struct X { type_a var_a; type_b var_b; type_c var_c; type_d var_d; }; 

vous pouvez initialiser un object comme ceci:

 struct X x = {value_a, value_b, value_c, value_d}; 

Mais cela signifie que vous devez connaître l’ordre des variables dans X et avoir une valeur initiale pour chacune d’entre elles. Alternativement, vous pouvez initialiser comme ceci:

 struct X x = { .var_a = value_a, .var_b = value_b, .var_c = value_c, .var_d = value_d }; 

De cette façon, vous pouvez initialiser les variables de membre dans n’importe quel ordre, voire en ignorer certaines.

Ceci est particulièrement utile dans une bibliothèque dans laquelle vous devez initialiser certaines variables, alors que d’autres sont plus internes et peuvent même être modifiées avec différentes versions de votre bibliothèque. En utilisant ce type d’initialisation, l’utilisateur n’a pas besoin de connaître ces variables supplémentaires.

C’est une syntaxe C99 connue sous le nom d’ initialiseur désigné .

Dans les normes C précédentes, les éléments d’un initialiseur de structure devaient apparaître dans le même ordre que dans la définition de structure. Avec les initialiseurs désignés, cette ressortingction est levée. Naturellement, les membres de la structure doivent être nommés pour indiquer quel membre est en cours d’initialisation.

Les initialiseurs désignés peuvent également être utilisés avec des tableaux et vous permettent d’initialiser des éléments spécifiques d’un tableau. Par exemple:

 int a[6] = { [4] = 29, [2] = 15 }; 

C’est la fonction C99 appelée initialiseurs désignés . Il vous permet de spécifier les noms des champs pour lesquels vous définissez des valeurs plutôt que de spécifier les valeurs dans l’ordre d’affichage des champs correspondants dans la déclaration. De plus, cette syntaxe vous permet d’initialiser les membres des unions autres que la première, ce qui était impossible avant C99.