Le C et le C++ permettent la création de structures et unions anonymes.
La structure anonyme à l'intérieur de l'union permet de regrouper plusieurs valeurs sans passer par une variable intermédiaire (une structure nommée).
(Exemple en C pour changer.)
typedef enum { MOUSE, KEYBOARD } ActionType;
typedef struct {
ActionType type;
union {
int key;
struct {
unsigned int x, y;
};
} event;
} Action;
Action action1 = {MOUSE, {.x=0, .y=0}};
Action action2 = {KEYBOARD, {.key=128}};
Peu utilisé, il est possible de "déplacer" les attributs d'une structure sous-jacente dans la structure mère.
Par exemple une structure Coord à l'intérieur d'une structure Rect.
typedef struct {
int x, y;
} Coord;
typedef struct {
Coord coord;
int w, h;
} Rect;
Pour connaître la position il faut -et c'est dommage- passer par la variable coord. C'est à ce moment que l'union et la structure anonyme rentre en jeu.
typedef struct {
union {
Coord coord;
struct {
int x, y;
};
};
int w, h;
} Rect;
La contrainte est de devoir re-déclarer les attributs de la structure Coord. GCC fournit une extension (flag -fms-extensions) qui permet de s'en affranchir. Il faut indiquer le type, sans le nommer.
typedef struct {
Coord;
int w, h;
} Rect;
Mais comme toutes les extensions, à n'utiliser que dans des projets pour ce compilateur ;).
Aucun commentaire:
Enregistrer un commentaire