Perché usare typedefs per le strutture?


12

in C (ANSI, C99, ecc.), le strutture vivono nel proprio spazio dei nomi. Una struttura per un elenco collegato potrebbe essere simile a questa:

struct my_buffer_type {
   struct my_buffer_type * next;
   struct my_buffer_type * prev;
   void * data;
};

Sembra abbastanza naturale, tuttavia, per la maggior parte dei programmatori C digitare automaticamente quelle strutture come le seguenti

typedef struct tag_buffer_type {
   struct tag_buffer_type * next;
   struct tag_buffer_type * prev;
   void * data;
} my_buffer_type;

E quindi fare riferimento alla struttura come un tipo normale, ad es get_next_element(my_buffer_type * ptr).

Ora la mia domanda è: c'è un motivo specifico per questo?

Wikipedia dice http://it.wikipedia.org/wiki/Typedef#Usage_concerns

Alcune persone si oppongono al vasto uso dei typedef. La maggior parte degli argomenti si basa sull'idea che typedefs nasconda semplicemente il tipo di dati effettivo di una variabile. Ad esempio, Greg Kroah-Hartman, un hacker e documentatore del kernel Linux, scoraggia il loro uso per qualsiasi cosa tranne le dichiarazioni di prototipi di funzioni. Sostiene che questa pratica non solo offusca inutilmente il codice, ma può anche indurre i programmatori ad abusare accidentalmente di grandi strutture ritenendole tipi semplici. [4]

Altri sostengono che l'uso di typedefs può rendere il codice più facile da mantenere. K&R afferma che ci sono due ragioni per usare un typedef. Innanzitutto, fornisce un mezzo per rendere un programma più portatile. Invece di dover cambiare un tipo ovunque appaia nei file sorgente del programma, è necessario modificare solo una singola istruzione typedef. In secondo luogo, un typedef può semplificare la comprensione di una dichiarazione complessa.

Personalmente mi chiedo se non ci sia abbastanza vantaggio di avere lo structspazio dei nomi separato a volte per non usare le strutture tipizzate e dato che ci sono diverse culture di programmazione C in giro (la programmazione Windows C ha tradizioni diverse rispetto alla programmazione Linux C nella mia esperienza) se ci sono altri tradizioni di cui non sono a conoscenza.

Quindi sono interessato a considerazioni storiche (predecessori, prime versioni di C).


4
Lo scopo di a typedef è nascondere il tipo effettivo di una variabile. Prendiamo time_tad esempio: se le persone vanno in giro usando il tipo intero sottostante, un cambiamento nell'implementazione come quello che sarà richiesto nel 2038 spezzerà un sacco di codice. Se le persone usano le strutture senza capire perché, questo è un fallimento nel programmatore, non nel costrutto.
Blrfl,

Risposte:


14

Ho lavorato su un grande progetto che ha ampiamente utilizzato strutture tipografiche. Lo abbiamo fatto per un paio di motivi. Si prega di tenere presente che questo era pre-C99 e segregazione dello spazio dei nomi.

  1. È stato più semplice digitare my_buffer_type *bufferinvece struct tag_buffer_type *bufferche per la dimensione della base di codice (1 M + loc) che ha fatto la differenza.

  2. Astratta la struttura in un oggetto. Invece di concentrarci su ogni singola variabile all'interno della struttura, ci concentreremo sull'oggetto dati che ha rappresentato. Questa astrazione ha portato al codice generalmente più utile e più facile da scrivere.

    • Penso che ciò sia in diretta contraddizione con la citazione attribuita a Greg Kroah-Hartman che hai fornito. FWIW, quel progetto era un'applicazione client / server e non un kernel, quindi ci sono sicuramente alcune considerazioni diverse da prendere in considerazione.
  3. Anche il trattamento della struttura come oggetto ci ha permesso di incapsulare meglio le informazioni. La revisione del codice ha rilevato alcune situazioni in cui uno sviluppatore più recente avrebbe violato i principi di incapsulamento che avevamo messo in atto. L'uso di strutture typedef'd ha reso ovvie quelle violazioni.

  4. La portabilità è stata una preoccupazione mentre scrivevamo per una mezza dozzina di piattaforme con il server e alcune altre con il client.


5

Ogni volta invece di digitare

struct my_buffer_type *buffer;

se typedeflo puoi usare direttamente

my_buffer_type *buffer;

typedefL 'uso principale è ridurre il numero di sequenze di tasti richieste per scrivere codice e migliorare la leggibilità.


hai ragione ma ho già descritto questo fatto nella mia domanda.
Wirrbel,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.