Comment utiliser c union imbriqué dans struct sans nom
Je suis en train de travailler sur le soi-disant Hotspot projet open source, et à la recherche à la mise en œuvre, j'ai trouvé un méchant imbriquée union struct le regarder de cette manière:
typedef struct RC_model_t_st
{
union
{
struct block_model_t_st *block;
struct grid_model_t_st *grid;
};
/* block model or grid model */
int type;
thermal_config_t *config;
}RC_model_t;
Autant que je suis au courant en C/C++ que l'union fait la unaccesible. Alors, comment quelqu'un peut faire usage de l'union déclarée de la manière et dans quel but?
Merci!
source d'informationauteur zwx
Vous devez vous connecter pour publier un commentaire.
tout d'abord, je tiens à dire que Une union, est une collection de variables de types différents, tout comme une structure. Cependant, avec les syndicats, vous ne pouvez stocker des informations dans un seul domaine à la fois.
Les syndicats sont utilisés essentiellement pour la mémoire enregistrement & sa taille est égale à la plus grande des membres de l'union.
Et pour l'accès aux données des champs d'une union, l'utilisation de l'opérateur point(.) tout comme vous le feriez pour une structure et expliqué par @Atmocreations. Lorsqu'une valeur est affectée à l'un des membres, l'autre membre(s) se faire fouetter car ils partagent la même mémoire.
comme un exemple où les syndicats peut être utile, c'est
....
L'union ci-dessus peuvent être utilisées pour stocker l'heure actuelle (en secondes) temps de maintien précis à la seconde. Ou il pourrait être utilisé pour maintenir l'heure exacte à une milliseconde. Sans doute il ya des moments où vous souhaitez que l'un ou l'autre, mais pas les deux. Cette déclaration devrait vous être familier. C'est la même que la structure de la définition, mais avec le mot-clé union au lieu de la struct.
pour plus d'info http://msdn.microsoft.com/en-us/library/5dxy4b7b(v=vs. 80).aspx
C'est un anonyme de l'union. En C++, comme par [la classe.de l'union], paragraphe 5:
Cela signifie que vous pouvez accéder à ses membres, comme s'ils étaient des membres de
RC_model_t_st
.Sans en être sûr et sans avoir essayé:
L'union elle-même n'est pas accessible, mais ses membres sont.
Par conséquent, vous devriez être en mesure de faire référence à
obj.block
etobj.grid
Ce code ici (https://gist.github.com/klange/4042963) montre comment l'accès anonyme syndicats à l'intérieur de struct. Vous venez d'accéder aux membres de imbriquée de l'union que s'ils sont membres de la structure.
Noms déclarés dans l'anonymat de l'union sont utilisés directement, comme les non-membre de variables.
Une bonne raison de le faire est d'économiser de la mémoire.
De donner des précisions sur la réponse fournie par Angew citant la norme concernant les anonymes, les syndicats et les structures, j'ai pensé à fournir un exemple de code source C avec la sortie générée par cet exemple montrant comment les valeurs sont alloués dans un
struct
et ununion
composé destruct
etunion
composants.La norme citée par Angew est:
Le code source d'un
struct
composé de nommé et anonyme, les structures et les syndicats se présente comme suit. C'est à l'aide de Visual Studio 2005 et de la#pragma (pack, 1)
est utilisé pour aligner le tout sur unchar
limite dans l'ordre pour qu'il y ait pas de trous de mémoire. Il y a aussi un simple Préprocesseur C macro définie pour rendre la sortie plus lisible et plus facile à coder.La sortie générée par cette fonction ressemble:
La sortie montre le chevauchement entre les différentes composantes de la principale
struct
Things
causés par l'utilisation des syndicats. Vous pouvez également voir comment les composants de l'anonymestruct
etunion
sont référencés par rapport à ceux des composants de l'nomméstruct
etunion
.Aussi juste pour le fun j'ai essayé d'ajouter une définition de tableau de
const UCHAR myArray[];
après l'anonymeunion
contenantconst UCHAR myArray[];
pour voir ce qui allait se passer. Le compilateur se plaint avec une erreur deerror C2020: 'myArray' : 'struct' member redefinition
. L'ajout de commentaires dans lesstruct
définition deThings
ci-dessus. Cependant, depuis la seconde utilisation deconst UCHAR myArray[];
est dans ununion
la compilation fonctionne parce que le deuxième utilisation est accessible en précisant le nom de l'union.