Pages

jeudi 3 janvier 2013

Structure et union anonyme

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: