Tutoriel de programmation Linux C Partie 28 – Typedefs

Dans ce tutoriel – qui fait partie de lasérie de tutoriels de programmation C en cours – nous allons aborder le concept de typedef. Comme son nom l’indique (pense à typedef comme type+def), typedef est une facilité fournie par le langage C pour définir de nouveaux noms pour les types de données existants.

Typedef dans le langage de programmation C

Voici un exemple qui montre comment utiliser typedef :

typedef int my_int

La ligne ci-dessus, qui commence par le mot-clé ‘typedef’, donne au type de données ‘int’ un nouveau nom : ‘my_int’. Ainsi, un code comme celui-ci :

#include <stdio.h>

int main()
{
int a = 10;
printf("The value of a is: %d", a);

return 0;
}

peut être écrit comme suit lorsqu’on utilise l’exemple de typedef dont nous venons de parler :

#include <stdio.h>

typedef int my_int;

int main()
{
my_int a = 10;
printf("The value of a is: %d", a);

return 0;
}

Maintenant, une question que certains peuvent se poser est de savoir quelle est la différence entre un typedef et un #define ? Eh bien, même si les deux semblent faire des choses similaires, il y a en fait pas mal de différences entre les deux.

Tout d’abord, un typedef est interprété par le compilateur, alors qu’un #define n’arrive jamais à l’étape de la compilation car il est interprété à l’étape du prétraitement lui-même. Ensuite, un typedef suit les règles de portée, alors qu’un #define ne le fait pas. Voici un exemple de cela :

#include <stdio.h>

void my_func();

int main()
{
typedef int my_int;
my_int a = 10;
printf("The value of a is: %d", a);
my_func();

return 0;
}

void my_func()
{
my_int b = 20;
printf("The value of a is: %d", b);

return;
}

Lorsque ce code est exécuté, tu obtiens l’erreur suivante :

main.c: In function ‘my_func’:
main.c:25:5: error: unknown type name ‘my_int’
my_int b = 20;
^

Comme tu peux le voir, le compilateur n’a pas pu reconnaître le type ‘my_int’ dans la fonction ‘my_func’, car la portée sous laquelle le typedef était valide était la portée de la fonction ‘main’.

Il existe ensuite d’autres différences entre un typedef et un #define. Par exemple, en utilisant un #define, tu peux aussi créer des alias pour des valeurs constantes – tu peux faire quelque chose comme ‘#define PIE 3.14’. De plus, comme tu l’auras remarqué, un #define n’est pas terminé par un point-virgule alors qu’un typedef l’est.

Maintenant, on peut toujours se demander pourquoi nous avons besoin de ‘typedef’. Ou en d’autres termes, où est-ce qu’un typedef est vraiment utile ? Eh bien, suppose qu’il y ait un morceau de code avec des fonctions qui renvoient « un pointeur vers une fonction qui accepte deux entiers comme arguments et renvoie une valeur de caractère ».

Au cas où tu ne le saurais pas, un tel pointeur est déclaré de la manière suivante :

char (*fn_ptr) (int, int);

Où fn_ptr est le nom d’un tel pointeur.

Donc plutôt que de devoir utiliser ce genre de déclaration longue et complexe encore et encore comme type de retour d’autres fonctions, tu peux simplement faire de fn_ptr un type en utilisant typedef :

typedef char (*fn_ptr) (int, int);

Et maintenant, tu peux simplement utiliser ‘fn_ptr’, et cela signifiera un pointeur de ce type.

Une autre utilisation de typedef consiste à utiliser dans le code un type de données défini par l’utilisateur qui correspond au type natif fourni par la plateforme sous-jacente sur laquelle le code s’exécute. De cette façon, les typedefs aident à faciliter la compréhension et la maintenance de tout morceau de code développé pour fonctionner sur plusieurs plateformes.

Conclusion

Dans ce tutoriel, nous avons donc abordé les bases des typedefs, notamment ce que fait un typedef, en quoi il est différent d’une directive #define, et comment les typedefs peuvent te sauver la mise en rendant le code facile à lire, à comprendre et à maintenir.

Nous te conseillons d’essayer les exemples que nous avons utilisés ici et de développer d’autres exemples pour mieux comprendre les typedefs, et comme toujours, en cas de doute ou de question, envoie un commentaire ci-dessous.

Vous aimerez aussi...