Por que usar typedefs para estruturas?


12

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 structespaç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).


4
O objetivo de a typedef é ocultar o tipo real de uma variável. Tomemos time_tcomo 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.
Blrfl

Respostas:


14

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.

  1. Era mais fácil digitar em my_buffer_type *buffervez de struct tag_buffer_type *buffere para o tamanho da base de código (1M + loc) que fazia uma grande diferença.

  2. 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.

    • Acho que isso está em contradição direta com a citação atribuída a Greg Kroah-Hartman que você forneceu. FWIW, esse projeto era um aplicativo cliente / servidor e não um kernel, então há definitivamente algumas considerações diferentes a serem consideradas.
  3. 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.

  4. A portabilidade era uma preocupação, como escrevemos para meia dúzia de plataformas com o servidor e muito mais com o cliente.


5

Toda vez, em vez de digitar

struct my_buffer_type *buffer;

se você typedefpode usar diretamente

my_buffer_type *buffer;

typedefO principal uso da ferramenta é reduzir o número de pressionamentos de teclas necessários para escrever código e aprimorar a legibilidade.


você está certo, mas eu já descrevi esse fato na minha pergunta.
Wirrbel #
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.