2010-04-09 17 views
9

He visto códigos fuente siempre teniendo un typedef para una estructura y usando el mismo en todas partes en lugar de usar el nombre de la estructura como "struct sname", etc. directamente?¿Por qué deberían los nombres de estructura tener un typedef?

¿Cuál es la razón detrás de esto? ¿Hay alguna ventaja al hacer esto?

+0

En su libro * Expert C Programming *, Peter van der Linden defiende que los typedefs para las estructuras son inútiles y no debería molestarse. Me gusta esto. Todo lo que hace typedef es que te ahorra escribir 'struct' en algunos lugares como declaraciones y prototipos. No vale la pena la ofuscación. Quiero saber inmediatamente cuándo tengo que usar '->' o '.'. Typedefs hace esto más difícil. – Jens

Respuesta

10

Su más fácil de leer que Box b;struct boxtype b;

typedef struct _entry{ 
    char *name; 
    int id; 
} Entry, *EntryP; 

Ventaja:
En lo anterior typedef, tanto Entry & EntryP se definen aparte de struct _entry.
Por lo tanto, EntryP firstentry se puede utilizar en lugar de struct _entry *firstentry y es un poco más simple de analizar en mente.

Nota: No es como nombres de estructura debe sertypedef ined, pero evidentemente es más fácil de leer. Además, el uso de Entry * frente a EntryP es totalmente dependiente del usuario.

+3

Generalmente argumento contra typedefs como 'EntryP'. C ya tiene una manera perfectamente buena de declarar el puntero que deseas: 'Entry * firstentry'. –

+1

@Hagglund: No hay nada que discutir :). Es totalmente subjetivo, a uno le puede gustar 'EntryP', mientras que a otro le puede gustar 'Entry *'. –

+1

Acepto que es subjetivo pero llegué a pensar que no es recomendable ya que abstrae el hecho de que 'firstentry' es del tipo' Entry * 'sin una buena razón. Aunque la 'P' en 'EntryP' está destinada a enfatizar el 'puntero', sigue siendo ambigua, mientras que 'Entry *' no lo es. En cualquier caso, creo que su línea 'struct entry * firstentry' debe ser' struct _entry * firstentry', tenga en cuenta que el guión bajo – SiegeX

1

Es una forma de ocultación de información y útil al crear tipos opacos. Consulte this SO link para obtener una respuesta un poco más larga.

3

Me gustaría hacer esto en C:

// in a "public" header file 
typedef struct Example Example; 

// in a "private" header or a source file 
struct Example { ... }; 

como no, tengo Example como un tipo opaco (es decir, sólo puedo pasar punteros a que sobre) a lo largo de mi código, excepto para el código que implementa sus operaciones, que puede ver lo que realmente se define como. (Puede usar un nombre diferente para el tipo opaco, pero no hay una ventaja real para eso.)

1

Un nombre de estructura no de tipo definido en C requiere que se agregue "struct" en todas partes donde se usa el nombre de tipo, por lo que la mayoría de la gente usa typedef para crear un nuevo nombre para el tipo que no necesita tener la palabra clave struct incorporada todo el tiempo.

Las razones para hacer esto son la legibilidad del código, el mecanografiado reducido, y probablemente la claridad también, pero typedefs en realidad puede oscurecer la información sobre los tipos de puntero.

Honestamente, la necesidad de typedef para crear nuevos nombres para las estructuras es una reliquia, y es una pena que C99 no siga el ejemplo de C++ y lo elimine.

+0

C99 no pudo deshacerse de tener que 'typedef' para deshacerse de' struct' porque estaba hacia atrás compatibilidad. Hay muchos códigos como 'struct Foo {...}; typedef ... Foo; 'que dejaría de compilar. – JeremyP

4

Es una peculiaridad extraña en el lenguaje C, los nombres de las etiquetas de estructura se almacenan en un espacio de nombres diferente (tabla de símbolos). El lenguaje C++ se deshizo de este comportamiento. El typedef crea un alias para el tipo de estructura en el espacio de nombres global. Entonces no tiene que escribir "struct" antes del nombre de la estructura.

No estoy seguro de qué estaba fumando Ritchie cuando definió este comportamiento. Supongo que hay algún tipo de problema con el analizador en una versión anterior del compilador.

+0

Supongo que esto probablemente simplificó la asignación de memoria en los primeros compiladores, lo que era importante cuando todo tenía que caber en 128k o menos de espacio de datos. De hecho, en los primeros compiladores de C, también había un único espacio de nombres * global * para los nombres de los miembros de la estructura. Esto significaba que 'struct foo' y' struct bar' no podían tener un miembro llamado 'x', que conducen directamente al estilo del taglet (' f_x', 'b_x') para los miembros de la estructura que es común hoy en día en algunos Código C –

+0

@Dave: creo que tienes razón. Algo estaba humeando con los nombres de los miembros de la estructura. Ha pasado demasiado tiempo, puse esa célula cerebral en la esquina de ignorar hace mucho tiempo. Wow, ¿por qué tenía que hacerlo? ¿SEGUNDO? –

2

Es solo para la legibilidad del código. typedefs son solo para dar un nuevo nombre para el tipo de datos. En lugar de dar int en todos los lugares donde puede nombrarlo de la manera que desee y donde quiera que use int, puede simplemente reemplazarlo por el nuevo nombre que ha dado. Lo mismo se aplica a las estructuras también.

0

En realidad, no uso typedef para las estructuras. ¿Por qué? Porque de todos modos usaría alguna convención como el prefijo s_, para ver fácilmente qué tipo de variable estoy viendo.

Dado que uso muchos tipos de datos abstractos, creo que sería una buena idea usar un typedef, para que el usuario realmente lo use como un tipo opaco. Pero en la práctica siempre uso una estructura en la implementación de todos modos.

Cuestiones relacionadas