Je lis du code et j'ai trouvé quelque chose comme ce qui suit: du point de vue de la syntaxe, l'interface Union {} peut être retiré et avoir * A, * B et * c directement à l'intérieur de l'union externe {}. Alors, quel est le but l'union sans nom absolument? p> p>
3 Réponses :
permet au même pointeur d'être appelé A, B ou C. Peut-être qu'il y a du code hérité qui ne peut pas être d'accord sur le nom à utiliser. P>
Mais c'est déjà à l'intérieur d'une union. Donc, la structure interne de l'Union est redondante.
Selon la réponse de Yu Hao, il semble être Code moderne i> (C11) plutôt que Legacy i> code.
Union non nomée / structure à l'intérieur Autre Union / STRIT est une caractéristique de C11 et certaines extensions de compilateur (par exemple, GCC ).
C111 §6.7.2.1 Structure et Spécificateurs syndicaux h3>
13
code> Un membre non nomé dont le spécificateur de type est un spécificateur de structure sans étiquette est appelé structure anonyme; Un membre Sans nom dont le spécificateur de type est un spécificateur syndical sans étiquette est appelé un syndicat anonyme. Les membres d'une structure anonyme ou d'union sont considérés comme membres de la structure contenant ou de l'union. Ceci s'applique récursivement si la structure contenant ou l'union est également anonyme. P> blockQuote>
L'avantage de cette fonctionnalité est que l'on peut accéder à son champ Union Sans nom, plus facile: P>
xxx pré> pour accéder au champ
A code> , vous pouvez simplement utiliser
XA code>. Comparez avec le code sans utiliser cette fonctionnalité: p>
xxx pré> Vous devez utiliser
xua code>. P>
lié:
STRUCTY / Union sur C P> P>
Vous voulez dire un, b, c sont des membres «directs» de type_t dans l'exemple original?
@ WAP26 essentiellement oui, c'est la façon dont la syntaxe lit pour y accéder.
Mais n'est-ce pas la même chose que d'éliminer l'unité intérieure? Je veux dire, tous les membres ont la même adresse à la fin, non?
@ Lang2 Non Ce n'est pas la même chose, car un B et C partageront le même espace mémoire. Si vous enlevez entièrement l'union, ils obtiendront chacun leur propre morceau de mémoire.
@ Lang2 J'ai mis à jour la réponse, la question liée liée peut vous aider.
@ Lang2 Ah Yeah Néanmoins, pour une raison quelconque, je pensais que l'Union extérieure était une structure.
Si l'Union nommée ne devrait-elle pas être déclarée Union {...} U; Code>?
Je pense que l'usage prévu est plus "Union anonyme à l'intérieur d'un struct em>", et le comportement de "Union anonyme à l'intérieur d'un syndicat" étant identique à une union "plate" est juste un compromis acceptable pour la cohérence. p>
C'est un morceau intéressant de trivia C, c'est comme la syntaxe null. Potentiellement utile pour une compétition de code obscurcie.