J'ai utilisé les syndicats plus tôt confortablement; aujourd'hui, j'ai été effrayé quand j'ai lu ce post et est venu de savoir que ce code
union ARGB
{
uint32_t colour;
struct componentsTag
{
uint8_t b;
uint8_t g;
uint8_t r;
uint8_t a;
} components;
} pixel;
pixel.colour = 0xff040201; // ARGB::colour is the active member from now on
// somewhere down the line, without any edit to pixel
if(pixel.components.a) // accessing the non-active member ARGB::components
est en fait un comportement indéterminé I. e. lecture à partir d'un membre de l'union autres que celle qui s'est récemment écrit à conduit à un comportement indéterminé. Si ce n'est pas le but de l'utilisation des syndicats, c'est quoi? Certains ont-ils un s'il vous plaît expliquer minutieusement?
Mise à jour:
Je tenais à préciser un peu les choses avec du recul.
- La réponse à la question n'est pas la même pour le C et le C++; mon ignorance jeune marqués à la fois comme le C et le C++.
- Après avoir écumé par le biais de C++11 est la norme, je ne pouvais pas dire avec certitude qu'il appelle d'accéder à l'inspection d'un non-actif membre de l'union n'est pas défini/non/de mise en œuvre définies. Tout ce que je pouvais trouver §9.5/1:
Si un modèle de mise en page de l'union contient plusieurs normes-mise en page des structures qui partagent une même séquence initiale, et si un objet de la présente norme-mise en page type d'union contient l'un des standard-layout structures, il est autorisé à inspecter la commune de séquence initiaux de l'un de standard-layout les membres de la structure. §9.2/19: standard-layout structures partagent une séquence initiale si les membres correspondants ont mise en page des types compatibles et soit ni membre est un peu de champ, ou les deux, sont peu-champs, avec la même largeur pour une séquence d'un ou de plusieurs membres initiaux.
- Alors que dans C (C99 TC3 - DR 283 et suivantes), il est légal de le faire (merci à Pascal Cuoq pour s'élever). Cependant, tenter de le faire , elle peut encore conduire à un comportement indéfini, si la valeur lue se passe invalide ("piège de la représentation") pour le type c'est de lire à travers. Sinon, la valeur lue est définie par l'implémentation.
-
C89/90 appelé ce en vertu de comportement non spécifié (Annexe J) et K&R du livre dit qu'elle est définie par l'implémentation. Citation de K&R:
C'est le but d'une union - une seule variable qui peut légitimement tenir l'un d'un de plusieurs types. [...] tant que l'utilisation est conforme: le type (extrait doit être le type le plus récemment enregistrés. C'est le programmeur a la responsabilité de garder une trace de quel type est actuellement stockées dans une union; les résultats sont dépendant de l'implémentation si quelque chose est stocké comme un type et extrait comme de l'autre.
-
Extrait de Stroustrup TC++PL (l'emphase est mienne)
L'utilisation de syndicats peut être essentiel pour compatness de données [...] parfois utilisé pour le "type de conversion".
Par-dessus tout, cette question (dont le titre reste inchangé depuis mon ask) a été posée avec l'intention de comprendre le but des syndicats ET non pas sur ce qu'est la norme permet à E. g. L'utilisation de l'héritage pour la réutilisation de code est, bien sûr, autorisée par la norme C++, mais ce n'était pas le but ou l'intention d'origine de l'introduction de l'héritage en C++ le langage. C'est la raison pour Andrey réponse continue à rester comme acceptée.