'typedef' est un outil puissant pour créer de nouveaux noms (alias) de types, ce qui rend le code plus concis et plus facile à maintenir et à comprendre. Le mot-clé est apparu dans les premières versions de C, simplifiant la vie des développeurs de grands projets, lorsque de longues déclarations de structures et de pointeurs rendaient le code illisible et difficile à maintenir.
À l'origine, les structures et unions étaient définies à l'aide de longues déclarations avec les mots-clés struct, union, enum. Avec l'accroissement du code, ces déclarations sont devenues redondantes et encombrantes, ce qui a conduit à l'introduction de typedef — pour réduire et standardiser les types.
Les erreurs typiques sont liées à une mauvaise compréhension des alias, à la confusion entre typedef et la déclaration de structures, aux structures anonymes, aux difficultés avec les tableaux de pointeurs et aux conventions de nommage non documentées.
'typedef' permet de donner des noms courts à des types existants — qu'ils soient de base ou composés :
Exemple de code :
typedef struct Point { int x, y; } Point; Point p1; // au lieu de 'struct Point p1;' typedef unsigned char byte; byte buffer[8];
Caractéristiques clés :
1. Peut-on créer "un nouveau type" avec typedef, pour qu'il soit incompatible avec le type de base (par exemple, int) ?
Non. typedef ne fait que donner un alias. Le type au niveau du compilateur restera le même, le casting est possible sans erreurs de compilation.
2. Si je déclare typedef struct {} name_t;, puis struct name_t var;, quel est le résultat ?
C'est une erreur ! Après typedef struct MyStruct { ... } Name;, on utilise Name pour les variables, et non struct Name. struct Name est inconnu du compilateur — cela ne fonctionne pas.
3. typedef int arr[10]; arr a,b; Quel est le type de a et b ?
a et b sont tous deux des tableaux de int de longueur 10. Ce ne sont pas des pointeurs ! Erreur — on aurait pu s'attendre à 'int* a, b', si l'on oublie les spécificités de typedef avec les tableaux et les pointeurs.
Dans un projet, on déclare typedef struct User { ... } User;, mais on utilise struct User my_user; — le compilateur se plaint, le code n'est pas portable.
Avantages :
Inconvénients :
Dans tout le projet, on suit une seule norme : typedef struct {...} Name;, n'utilisent que Name var; sans struct.
Avantages :
Inconvénients :