Certains compilateurs C ++ autorisent les unions et les structures anonymes comme extension du C ++ standard. C'est un peu de sucre syntaxique qui est parfois très utile.
Quelle est la raison pour laquelle cela ne fait pas partie de la norme? Y a-t-il un barrage technique? Un philosophique? Ou tout simplement pas assez de besoin pour le justifier?
Voici un échantillon de ce dont je parle:
struct vector3 {
union {
struct {
float x;
float y;
float z;
};
float v[3];
};
};
Mon compilateur acceptera cela, mais il avertit que "struct / union sans nom" est une extension non standard de C ++ .
struct { int i; } a; a.i = 0;
(le type n'a pas de nom). Le second est celui-ci, que C ++ ne prend pas en charge:struct { int i; }; i = 0;
(le type n'a pas de nom, et il s'échappe dans la portée environnante). C ++, cependant, prend en charge les unions non nommées et anonymes .Réponses:
Comme d'autres l'ont souligné, les unions anonymes sont autorisées dans le C ++ standard, mais les structures anonymes ne le sont pas.
La raison en est que C prend en charge les unions anonymes mais pas les structures anonymes *, donc C ++ prend en charge la première pour la compatibilité mais pas la seconde car elle n'est pas nécessaire pour la compatibilité.
De plus, les structures anonymes en C ++ sont peu utiles. L'utilisation que vous démontrez, d'avoir une struct contenant trois flotteurs qui peuvent être désignés soit par
.v[i]
, ou.x
,.y
et.z
, je crois que les résultats dans un comportement non défini en C ++. C ++ ne vous permet pas d'écrire sur un membre d'une union, par exemple.v[1]
, puis de lire à partir d'un autre membre, par exemple.y
. Bien que le code qui le fasse ne soit pas rare, il n'est pas vraiment bien défini.Les fonctionnalités de C ++ pour les types définis par l'utilisateur fournissent des solutions alternatives. Par exemple:
* C11 ajoute apparemment des structures anonymes, donc une future révision de C ++ pourrait les ajouter.
la source
Je dirai que vous pouvez nettoyer votre
vector3
déclaration en utilisant simplement ununion
Bien sûr, les structures anonymes étaient une extension MSVC . Mais ISO C11 le permet maintenant, et gcc le permet , tout comme le compilateur llvm d'Apple.
Pourquoi en C11 et non en C ++ 11? Je ne suis pas sûr, mais pratiquement, la plupart des compilateurs C ++ (gcc ++, MSVC ++ et le compilateur C ++ d'Apple) les prennent en charge.
la source
Pas sûr de ce que vous voulez dire. Section 9.5 de la spécification C ++, clause 2:
Vous pouvez également faire des choses comme celle-ci:
Pas toujours très utile ... bien que parfois utile dans les définitions de macro désagréables.
la source
Les syndicats peuvent être anonymes; voir la norme, 9.5 paragraphe 2.
À quoi pensez-vous qu'une structure ou une classe anonyme remplit? Avant de spéculer pourquoi quelque chose n'est pas dans la norme, j'aimerais avoir une idée de pourquoi cela devrait être, et je ne vois pas d'utilisation pour une structure anonyme.
la source
Sur la base de la modification, des commentaires et de cet article MSDN: Structures anonymes , je vais risquer une supposition - cela correspond mal au concept d'encapsulation. Je ne m'attendrais pas à ce qu'un membre d'une classe joue avec mon espace de noms de classe au-delà du simple ajout d'un membre. De plus, les modifications apportées à la structure anonyme peuvent affecter ma classe sans autorisation.
la source
Votre code
est comme
qui est sûrement invalide (en C99 et avant).
La raison est probablement de simplifier l'analyse (en C), car dans ce cas, il vous suffit de vérifier que le corps struct / union n'a que des "déclarations déclaratrices" comme
Cela dit, gcc et "autres compilateurs" prennent en charge les champs sans nom comme extension.
Edit: Les structures anonymes sont désormais officiellement supportées en C11 (§6.7.2.1 / 13).
la source
union { ... }
soit différent destruct { ... }
. Le premier est valable, mais le second ne l'est pas.union { ... };
n'est pas valide n'est pas correct.