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).
fonte
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.Respostas:
Trabalhei em um grande projeto que usou extensivamente estruturas digitadas. Fizemos isso por alguns motivos. Lembre-se de que era antes da C99 e segregação de namespace.
Era mais fácil digitar em
my_buffer_type *buffer
vez destruct tag_buffer_type *buffer
e para o tamanho da base de código (1M + loc) que fazia uma grande diferença.Abstrai a estrutura em um objeto. Em vez de focar em todas as variáveis individuais dentro da estrutura, focaríamos no objeto de dados que ela representava. Essa abstração levou a um código geralmente mais útil e mais fácil de escrever.
Tratar a estrutura como um objeto também nos permitiu encapsular melhor as informações. A revisão de código detectou algumas situações em que um desenvolvedor mais novo violaria os princípios de encapsulamento que implementamos. O uso de estruturas typedef'd realmente tornou essas violações óbvias.
A portabilidade era uma preocupação, como escrevemos para meia dúzia de plataformas com o servidor e muito mais com o cliente.
fonte
Toda vez, em vez de digitar
se você
typedef
pode usar diretamentetypedef
O principal uso da ferramenta é reduzir o número de pressionamentos de teclas necessários para escrever código e aprimorar a legibilidade.fonte