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) :
Dans le .c, SHOW_IMPLEMENTATION_ENSEMBLE_COLORE sera défini et on pourra accéder à tous les champs.
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;
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é) :
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".
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 EnsembleColore foo; // .... foo->unDesPointeurs();
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.
Partager