Perché usare typedef per le strutture?

11

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, che la maggior parte dei programmatori C digiti automaticamente quelle strutture come la seguente

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

E quindi fai riferimento alla struttura come un tipo normale, cioè get_next_element(my_buffer_type * ptr) .

Ora la mia domanda è: c'è una ragione specifica per questo?

Wikipedia dice link

Some people are opposed to the extensive use of typedefs. Most arguments center on the idea that typedefs simply hide the actual data type of a variable. For example, Greg Kroah-Hartman, a Linux kernel hacker and documenter, discourages their use for anything except function prototype declarations. He argues that this practice not only unnecessarily obfuscates code, it can also cause programmers to accidentally misuse large structures thinking them to be simple types.[4]

Others argue that the use of typedefs can make code easier to maintain. K&R states that there are two reasons for using a typedef. First, it provides a means to make a program more portable. Instead of having to change a type everywhere it appears throughout the program's source files, only a single typedef statement needs to be changed. Second, a typedef can make a complex declaration easier to understand.

Personalmente mi chiedo se non ci sia abbastanza vantaggio di avere lo spazio dei nomi struct separato a volte non usare le strutture typedef e dato che ci sono diverse culture di programmazione C in giro (la programmazione di Windows C ha tradizioni diverse dalla programmazione di Linux C nel mio esperienza) se ci sono altre tradizioni di cui non sono a conoscenza.

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

    
posta wirrbel 23.04.2013 - 18:58
fonte

2 risposte

13

Ho lavorato su un grande progetto che usava ampiamente le strutture tipef. Lo abbiamo fatto per un paio di motivi. Tieni presente che questa era pre-C99 e segregazione dello spazio dei nomi.

  1. È stato più facile digitare my_buffer_type *buffer anziché struct tag_buffer_type *buffer , e per la dimensione del codebase (1M + loc) che ha fatto una grande differenza.

  2. Estrae la struttura in un oggetto. Piuttosto che concentrarsi su ogni singola variabile all'interno della struttura, ci concentreremmo sull'oggetto di dati che rappresentava. Questa astrazione ha portato a un codice generalmente più utile e più facile da scrivere.

    • Penso che questo sia in diretta contraddizione con la citazione attribuita a Greg Kroah-Hartman che tu 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. Trattare la struttura come oggetto ci ha anche permesso di incapsulare meglio le informazioni. La revisione del codice ha rilevato alcune situazioni in cui un nuovo sviluppatore violerebbe i principi di incapsulamento che avevamo messo in atto. Usare le strutture typedef ha reso tali violazioni ovvie.

  4. La portabilità era un problema, come abbiamo scritto per una mezza dozzina di piattaforme con il server e un bel po 'di altre con il client.

risposta data 23.04.2013 - 19:39
fonte
5

Ogni volta invece di digitare

struct my_buffer_type *buffer;

se si typedef è possibile utilizzare direttamente

my_buffer_type *buffer;

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

    
risposta data 23.04.2013 - 19:17
fonte

Leggi altre domande sui tag