Séquence initiale commune dans les structures nestedes dans l’union – définition dans la norme C

La norme C11 contient la définition suivante de la séquence initiale commune partagée par les structures nestedes dans une même union:

6.5.2.3/6

Une garantie spéciale est donnée afin de simplifier l’utilisation des unions: si une union contient plusieurs structures partageant une séquence initiale commune (voir ci-dessous), et si l’object union contient actuellement l’une de ces structures, il est autorisé à inspecter la structure commune. partie initiale de l’un d’entre eux où qu’une déclaration du type complet de l’union soit visible. Deux structures partagent une séquence initiale commune si les membres correspondants ont des types compatibles (et, pour les champs de bits, les mêmes largeurs) pour une séquence d’un ou de plusieurs membres initiaux.

Exemple 3 Ce qui suit est un fragment valide:

union { struct { int alltypes; } n; struct { int type; int intnode; } ni; struct { int type; double doublenode; } nf; } u; u.nf.type = 1; u.nf.doublenode = 3.14; /* ... */ if (unalltypes == 1) if (sin(u.nf.doublenode) == 0.0) /* ... */ 

Selon ma compréhension de cet article, le code ci-dessus est cependant invalide.

Dans l’instruction if externe, nous n::alltypes le membre de données n::alltypes est actif (simultanément avec ni::type et nf::type comme états standard), mais dans l’interne if nous utilisons nf::doublenode qui ne fait pas partie de la séquence initiale commune.

Quelqu’un peut-il clarifier cette question?

il est permis d’inspecter la partie initiale commune de [plusieurs structures partageant une séquence initiale commune]

En utilisant l’exemple fourni, cette partie de la spécification indique que puisque chaque type de membre possible de l’ union a un int comme champ initial, vous pouvez accéder à ce champ initial commun en utilisant l’ un des types de membre, même après l’initialisation de la variable. / utilisé comme l’un des types de membres spécifiques.

C’est ce que fait l’exemple: il accède à l’ alltypes int initial en tant alltypes membre alltypes d’un n , après avoir initialisé les champs suivants en tant que nf , puis accède au champ doublenode d’un nf , en utilisant la même variable.

Utiliser le union comme l’un des types possibles ne l’oblige pas à adopter une sorte de structure: c’est ainsi que fonctionnent les syndicats.

Notez que cette garantie existe depuis un certain temps: le même texte se trouve essentiellement dans la spécification ANSI , section: 3.3.2.3 Structure et membres d’union .