Ce que le type opaque interdit, mot pour mot
Exercice · niveau 2 · informatique (MP2I/MPI), chapitre 6 — Types et structures de données abstraites
Énoncé
On dispose de l'en-tête suivant, et de lui seul.
/* pile.h */
typedef struct pile_s pile; /* type OPAQUE */
pile* pile_creer(void);
void pile_empiler(pile* p, int x);
Que refuse le compilateur dans le code ci-dessous, et pourquoi ?
pile p; /* (a) */
pile* q = pile_creer();
printf("%d\n", q->n); /* (b) */
printf("%zu\n", sizeof(pile)); /* (c) */Corrigé
Les trois lignes sont refusées, et le compilateur donne trois fois le même mot : type incomplet.
(a) error: variable has incomplete type 'pile' (aka 'struct pile_s')
(b) error: incomplete definition of type 'struct pile_s'
(c) error: invalid application of 'sizeof' to an incomplete type 'pile'
L'explication est unique. Une déclaration struct pile_s; sans corps introduit un type dont le compilateur connaît le nom mais ni la taille ni les champs. Il sait donc manipuler des pile* — tous les pointeurs ont la même taille —, mais rien de ce qui exige de connaître la structure :
- (a) réserver une variable demande sa taille : impossible. C'est pourquoi un type opaque impose l'allocation dynamique, donc un
creeret undetruire. - (b) atteindre un champ demande son déplacement dans la structure : impossible. C'est le cœur du procédé — l'invariant ne peut être cassé que depuis le module.
- (c)
sizeofdemande la taille : impossible, pour la même raison que (a).
Ce que l'opacité permet en échange : remplacer un tableau dynamique par une chaîne de maillons ne change pas une ligne — ni même un octet — du code utilisateur, qui n'a pas besoin d'être relu. Sans opacité, tout code ayant écrit q->n serait à reprendre, et rien ne dirait lesquels.
Le prix, chiffré. Une indirection à chaque accès, un appel de fonction là où il y aurait eu une lecture de champ, et une paire allocation/libération par objet. Le dernier exercice de cette série le mesure.
Les autres exercices de ce chapitre Le cours du chapitre
Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.