12
votes

Union sans nom à l'intérieur d'un syndicat

Je lis du code et j'ai trouvé quelque chose comme ce qui suit: xxx

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?


1 commentaires

C'est un morceau intéressant de trivia C, c'est comme la syntaxe null. Potentiellement utile pour une compétition de code obscurcie.


3 Réponses :


0
votes

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.


2 commentaires

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 (C11) plutôt que Legacy code.



9
votes

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

13 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.

L'avantage de cette fonctionnalité est que l'on peut accéder à son champ Union Sans nom, plus facile: xxx

pour accéder au champ A , vous pouvez simplement utiliser XA . Comparez avec le code sans utiliser cette fonctionnalité: xxx

Vous devez utiliser xua .

lié: STRUCTY / Union sur C


7 commentaires

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; ?



7
votes

Je pense que l'usage prévu est plus "Union anonyme à l'intérieur d'un struct ", 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.


0 commentaires