Bonjour,

Dans un projet, des consignes nous imposent de "masquer l'implémentation des structures".

Mon binôme est arrivé à une structure de ce genre (on utilise des pointeurs de fonctions pour des raisons bien particulières) :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
typedef struct ImplEnsembleColore {
  TYPE * (* next)(GoshIterateur *, struct ImplEnsembleColore *, TYPE *);
  GoshIterateur(*createIterateur)(void);
  bool (*vide)(struct ImplEnsembleColore *);
  void (*ajouter)(struct ImplEnsembleColore *, TYPE);
  bool (*appartient)(struct ImplEnsembleColore *, TYPE);
 
#ifdef SHOW_IMPLEMENTATION_ENSEMBLE_COLORE
 
 EnsemblePosition positions;
 Couleur couleur;
 
#endif
 
} * EnsembleColore;
Dans le .c, SHOW_IMPLEMENTATION_ENSEMBLE_COLORE sera défini et on pourra accéder à tous les champs.

Ailleurs, on ne pourra récupérer que les pointeurs de fonctions (les autres champs n'étant pas définis) de cette manière (EnsembleColore ne sera d'ailleurs jamais déférencé) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
EnsembleColore foo;
// ....
foo->unDesPointeurs();
A mon grand étonnement, ce code compile ( j'étais pourtant sûr que l'éditeur de liens proférerait quelques insultes) mais je me demande s'il ne peut pas y avoir des problèmes avec "l'alignement".
En effet, dans une structure, tous les éléments sont dans l'ordre en mémoire mais pas forcément consécutif, le compilateur pouvant rajouter des octets de padding pour des raisons d'optimisations.

J'aimerai donc savoir, même si ce code fonctionne, si le comportement est bien défini par la norme.