En general, es una mala práctica.El problema importante es que no juega bien con const
:
typedef type_t *TYPE;
extern void set_type(TYPE t);
void foo(const TYPE mytype) {
set_type(mytype); // Error expected, but in fact compiles
}
Para que el autor de foo()
para expresar lo que realmente quieren decir, la biblioteca que ofrece TYPE
también debe proporcionar CONST_TYPE
:
typedef const type_t *CONST_TYPE;
para que foo()
pueda tener la firma void foo(CONST_TYPE mytype)
, y en este punto hemos descendido a farsa.
lo tanto una regla de oro:
Hacer typedefs de estructuras (en particular estructuras incompletas), no punteros a esas estructuras.
Si la definición de la estructura subyacente es no estar a disposición del público (que es a menudo loable), a continuación, que la encapsulación debe ser suministrada por el struct ser incompleta, en lugar de por typedefs inconvenientes:
struct type_t;
typedef struct type_t type_t;
void set_type(type_t *);
int get_type_field(const type_t *);
Confusiones Confusiones! –
Solo una de las respuestas a "punteros Typedef una buena idea?" alude a la interacción inútil con 'const' - y esa respuesta está clasificada en un nivel bajo. En mi humilde opinión, el problema de "const" es el problema más importante con este tipo de tipos de archivos, ... por lo tanto, no es realmente un duplicado. –
@John: No estoy de acuerdo con usted conclusión. Ha notado que una respuesta añadida mucho después de que se formuló la pregunta no recibió mucha atención, pero las preguntas siguen siendo fundamentalmente las mismas. – dmckee