en C (ANSI, C99, etc.), les structures vivent dans leur propre espace de noms. Une structure pour une liste chaînée pourrait ressembler à ceci:
struct my_buffer_type {
struct my_buffer_type * next;
struct my_buffer_type * prev;
void * data;
};
Il semble cependant tout à fait naturel pour la plupart des programmeurs C de taper automatiquement ces structures comme les suivantes
typedef struct tag_buffer_type {
struct tag_buffer_type * next;
struct tag_buffer_type * prev;
void * data;
} my_buffer_type;
Et puis référencez la structure comme un type normal, c'est-à-dire get_next_element(my_buffer_type * ptr)
.
Maintenant ma question est: Y a-t-il une raison spécifique à cela?
Wikipedia indique http://en.wikipedia.org/wiki/Typedef#Usage_concerns
Certaines personnes sont opposées à l'utilisation extensive des typedefs. La plupart des arguments se concentrent sur l'idée que les typedefs masquent simplement le type de données réel d'une variable. Par exemple, Greg Kroah-Hartman, un hacker et un documentateur du noyau Linux, décourage leur utilisation pour tout sauf les déclarations de prototype de fonction. Il fait valoir que cette pratique non seulement obscurcit inutilement le code, mais peut également amener les programmeurs à utiliser accidentellement de grandes structures en les considérant comme des types simples. [4]
D'autres soutiennent que l'utilisation de typedefs peut faciliter la maintenance du code. K&R indique qu'il y a deux raisons d'utiliser un typedef. Premièrement, il fournit un moyen de rendre un programme plus portable. Au lieu d'avoir à changer un type partout où il apparaît dans les fichiers source du programme, une seule instruction typedef doit être modifiée. Deuxièmement, un typedef peut rendre une déclaration complexe plus facile à comprendre.
Je me demande personnellement s'il n'y a pas assez d'avantages d'avoir l' struct
espace de noms séparé pour parfois ne pas utiliser les structures typedef et puisqu'il existe plusieurs cultures de programmation C (la programmation Windows C a des traditions différentes de la programmation Linux C selon mon expérience) s'il y en a d'autres traditions que je ne connais pas.
Ensuite je m'intéresse aux considérations historiques (prédécesseurs, premières versions de C).
typedef
est de masquer le type réel d'une variable. Prenonstime_t
un exemple: si les gens utilisent le type entier sous-jacent, un changement d'implémentation tel que celui qui sera requis en 2038 cassera énormément de code. FSi les gens utilisent des structures sans comprendre pourquoi, c'est un échec dans le programmeur, pas dans la construction.