kAworu's avatar

pointer typedef VS cpp

publié par kAworu
il y a presque deux ans

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 typedef de pointeurs. De manière générale, éviter typedef. Pour des enum ou des types qui existent déjà (genre typedef int score_t) ça peut passer. typedefiser (bav) des fonctions c'est pratique aussi, mais c'est les seules utilisations pas trop pourries de typedef.
  • 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).
aucun commentaire

écrire un commentaire

écrire un commentaire:


(utilisé pour gravatar, ne sera pas affiché)



tu peux utiliser la syntaxe markdown :)