em C (ANSI, C99, etc.), as estruturas vivem em seu próprio espaço para nome. Uma estrutura para uma lista vinculada pode ser algo como isto:
struct my_buffer_type {
struct my_buffer_type * next;
struct my_buffer_type * prev;
void * data;
};
Parece bastante natural, no entanto, para a maioria dos programadores C digitar automaticamente essas estruturas, como as seguintes
typedef struct tag_buffer_type {
struct tag_buffer_type * next;
struct tag_buffer_type * prev;
void * data;
} my_buffer_type;
E então referencie a estrutura como um tipo normal, ie get_next_element(my_buffer_type * ptr)
.
Agora, minha pergunta é: existe uma razão específica para isso?
A Wikipedia diz http://en.wikipedia.org/wiki/Typedef#Usage_concerns
Algumas pessoas se opõem ao uso extensivo de typedefs. A maioria dos argumentos se concentra na ideia de que typedefs simplesmente oculta o tipo de dados real de uma variável. Por exemplo, Greg Kroah-Hartman, um hacker e documentador de kernel do Linux, desencoraja seu uso para qualquer coisa, exceto declarações de protótipo de função. Ele argumenta que essa prática não apenas ofusca desnecessariamente o código, mas também pode fazer com que os programadores usem acidentalmente grandes estruturas, pensando que elas são tipos simples. [4]
Outros argumentam que o uso de typedefs pode facilitar a manutenção do código. K&R afirma que existem duas razões para usar um typedef. Primeiro, ele fornece um meio de tornar um programa mais portátil. Em vez de precisar alterar um tipo em todos os lugares em que aparece nos arquivos de origem do programa, apenas uma única instrução typedef precisa ser alterada. Segundo, um typedef pode facilitar a compreensão de uma declaração complexa.
Pessoalmente, pergunto-me se não há benefício suficiente em ter um struct
espaço de nome separado para, às vezes, não usar estruturas digitadas por typedef e, como existem várias culturas de programação C (a programação do Windows C tem tradições diferentes da programação do Linux C na minha experiência), se houver outras tradições que eu não conheço.
Então, estou interessado em considerações históricas (predecessores, primeiras versões de C).
typedef
é ocultar o tipo real de uma variável. Tomemostime_t
como exemplo: se as pessoas usarem o tipo inteiro subjacente, uma mudança na implementação, como a exigida em 2038, quebrará um grande número de códigos. Se as pessoas estão usando estruturas sem entender o porquê, isso é uma falha no programador, não na construção.