Pourquoi utiliser typedefs pour les structures?

12

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' structespace 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).

wirrbel
la source
4
Le but de a typedef est de masquer le type réel d'une variable. Prenons time_tun 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.
Blrfl

Réponses:

14

J'ai travaillé sur un grand projet qui a largement utilisé des structures typées. Nous l'avons fait pour deux raisons. Veuillez garder à l'esprit qu'il s'agissait d'une séparation avant C99 et d'espace de noms.

  1. Il était plus facile de taper à la my_buffer_type *bufferplace de struct tag_buffer_type *buffer, et pour la taille de la base de code (1M + loc), cela faisait une grande différence.

  2. Il résume la structure en un objet. Plutôt que de nous concentrer sur chaque variable individuelle dans la structure, nous nous concentrerions sur l'objet de données qu'elle représentait. Cette abstraction a conduit à un code généralement plus utile et plus facile à écrire.

    • Je pense que cela est en contradiction directe avec la citation attribuée à Greg Kroah-Hartman que vous avez fournie. FWIW, ce projet était une application client / serveur et non un noyau, il y a donc certainement des considérations différentes à prendre en compte.
  3. Traiter la structure comme un objet nous a également permis de mieux encapsuler l'information. La révision du code a détecté un certain nombre de situations où un développeur plus récent violerait les principes d'encapsulation que nous avions mis en place. L'utilisation de structures typées a vraiment rendu ces violations évidentes.

  4. La portabilité était une préoccupation car nous avons écrit pour une demi-douzaine de plates-formes avec le serveur et quelques autres avec le client.


la source
5

Chaque fois au lieu de taper

struct my_buffer_type *buffer;

si vous typedef, vous pouvez utiliser directement

my_buffer_type *buffer;

typedefLa principale utilité est de réduire le nombre de touches nécessaires pour écrire du code et d'améliorer la lisibilité.

AMohan
la source
vous avez raison, mais j'ai déjà décrit ce fait dans ma question.
wirrbel