en C (ANSI, C99, etc.), las estructuras viven en su propio espacio de nombres. Una estructura para una lista vinculada podría verse así:
struct my_buffer_type {
struct my_buffer_type * next;
struct my_buffer_type * prev;
void * data;
};
Sin embargo, parece bastante natural que la mayoría de los programadores de C tipifiquen automáticamente esas estructuras como las siguientes
typedef struct tag_buffer_type {
struct tag_buffer_type * next;
struct tag_buffer_type * prev;
void * data;
} my_buffer_type;
Y luego haga referencia a la estructura como un tipo normal, es decir get_next_element(my_buffer_type * ptr)
.
Ahora mi pregunta es: ¿Hay una razón específica para esto?
Wikipedia dice http://en.wikipedia.org/wiki/Typedef#Usage_concerns
Algunas personas se oponen al uso extensivo de typedefs. La mayoría de los argumentos se centran en la idea de que typedefs simplemente oculta el tipo de datos real de una variable. Por ejemplo, Greg Kroah-Hartman, un hacker y documentador del kernel de Linux, desaconseja su uso para cualquier cosa, excepto las declaraciones de prototipos de funciones. Argumenta que esta práctica no solo ofusca innecesariamente el código, sino que también puede hacer que los programadores usen accidentalmente grandes estructuras pensando que son tipos simples. [4]
Otros sostienen que el uso de typedefs puede hacer que el código sea más fácil de mantener. K&R afirma que hay dos razones para usar un typedef. Primero, proporciona un medio para hacer que un programa sea más portátil. En lugar de tener que cambiar un tipo en todas partes que aparece en los archivos fuente del programa, solo se necesita cambiar una sola declaración typedef. Segundo, un typedef puede hacer que una declaración compleja sea más fácil de entender.
Personalmente, me pregunto si no hay suficiente beneficio de tener el struct
espacio de nombres separado para no usar estructuras typedef'd y, dado que hay varias culturas de programación en C (la programación de Windows C tiene tradiciones diferentes a la programación de Linux C en mi experiencia) si hay otras tradiciones que no conozco.
Entonces me interesan las consideraciones históricas (predecesoras, primeras versiones de C).
typedef
es ocultar el tipo real de una variable. Tomemostime_t
como ejemplo: si las personas usan el tipo entero subyacente, un cambio en la implementación, como el que se requerirá en 2038, romperá una gran cantidad de código. Si las personas usan estructuras sin entender por qué, eso es un fracaso en el programador, no en la construcción.