Faire des typedef de pointeurs (et de manière plus générale, des typedef
tout court) SAYMAL. Le truc vicieux c'est que l'utilisation de const
devient un peu perturbante, voilà un exemple:
1 #include <stdio.h> 2 3 typedef int* pint; 4 5 int 6 main(int argc, char *argv[]) 7 { 8 int i = 42; 9 const pint pi = &i; 10 11 (void)printf("i = %d\n", i); 12 13 *pi = 12; 14 (void)printf("i = %d\n", i); 15 16 return (0); 17 }
Ça passe?
C'est clair ça passe
… et ça affiche:
42 12
Ligne 9, pi est de type (int * const) et pas (const int*) comme on
pourrait l'imaginer! En plus d'être "confusant" (petite dédicace à Mr.
Chappelier s'il me lit, et ceux qui trouvent fun devraient lire
ça) c'est assez pourri, un (const int*) c'est quand même
souvent plus pratique qu'un (int * const) (hochements de tête maintenant, "ah
oui c'est vrai" pour les motivés du vendredi matin).
Fais pas le malin
J'en vois un au fond qui lève la main!
Ouesh, taka utiliser des macros mec, c'est ouf genre:
#define pint int*et stout.
Effectivement, si on fait ça, pint est préprocessé en int* et du coup
const pint pi donnera const int *pi. En plus de rendre le compilateur
"unaware" (c'est vendredi, bientôt le weekend, relâchement toussa) de ce que je
vais qualifier de "typedef du pauvre", ça pose un problème lorsqu'on essaye
de déclarer deux variables:
1 #define pint int* 2 const pint a, b;
Hé oui, la ligne 2 est préprocessée en:
const int* a, b; /* a is (const int *) and b is (const int) */
Et là, c'est la fin des haricots.
sort ton crayon, ça sera dans l'exa!
- Pas de
typedefde pointeurs. De manière générale, évitertypedef. Pour desenumou des types qui existent déjà (genretypedef int score_t) ça peut passer.typedefiser (bav) des fonctions c'est pratique aussi, mais c'est les seules utilisations pas trop pourries detypedef. - Pas abuser cpp pour les types, ça donne des messages d'erreur horribles (comme d'hab' avec cpp en faite) et en plus l'erreur (le type de b) sera x lignes plus loin (à l'utilisation) que le problème (déclaration).