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 struct
spazio 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).
typedef
è nascondere il tipo effettivo di una variabile. Prendiamotime_t
ad 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.