2009-10-09 18 views
34

me había encontrado con el siguiente código:C typedef de puntero a la estructura

typedef struct { 
     double x; 
     double y; 
     double z; 
} *vector; 

¿Es esta una definición de tipo válida? El código compila y funciona bien. Solo tenía curiosidad si esta es una práctica común.

Respuesta

51

Absolutamente valido. Por lo general, se puede sacar el máximo provecho de esta manera mediante la definición de dos tipos de juntas:

typedef struct 
{ 
int a; 
int b; 
} S1, *S1PTR; 

Donde S1 es una estructura y S1PTR es el puntero a esta estructura.

+1

Muchas gracias que tiene mucho sentido. –

+0

... y tal vez 'const * S1CPTR'. – alecov

+0

Solo para confirmar que entiendo. Es eso equivalente a 'typedef struct {...} S1; typedef S1 * S1PTR; '? – DCShannon

-2

sí ... le ahorra la molestia de escribir constantemente la palabra 'struct' cada vez que declara la estructura vectorial o un puntero a ella.

+1

Creo que la pregunta tenía que ver más con el vector typedef'ing to * que con el vector. –

2

Es válido, lo que hace es definir un nuevo tipo. Como dijo @Alex, sería útil definir un tipo de tipo y puntero.

podría crear más punteros sólo mediante el uso

S1PTR ptr1, ptr2, ptr3, ...; 

en lugar de

S1 *ptr1, *ptr2, *ptr3, ...; 
3

Sí es válido. Si necesita más "seguridad" también se puede hacer

typedef struct vector_{ 
     double x; 
     double y; 
     double z; 
} *vector; 

continuación, puede utilizar tanto

struct vector_ *var; 
vector var; 

pero no se olvide que termina el punto y coma.

El uso exclusivo de typedef significa que usted lo nombra de esa manera. de lo contrario sería más o menos anónimo.

+1

Creo que puede usar el mismo nombre para ambos (es decir, no necesita el guión bajo pero puede dejar todo lo demás en su código igual, porque los espacios de nombres están separados). – RastaJedi

1

Sí, es válido como se describe en las respuestas anteriores. Una pequeña sugerencia, sería mejor si proporciona un nombre de etiqueta también, de la siguiente manera. Esto ayudaría a algunos IDE a analizar mejor su código.

typedef struct vactor_tag { 
     double x; 
     double y; 
     double z; 
} *vector; 
24

Sí, lo es. Pero es un mal estilo. No es la declaración directa de la estructura, sino la declaración directa de un tipo de puntero. Es ofuscación, la información de que una determinada variable o parámetro es un puntero (y en menor medida para las matrices) es extremadamente importante cuando se quiere leer el código.

Al revisar el código, a menudo es difícil ver a primera vista qué función podría tener un efecto secundario o no. Si los tipos utilizados ocultan esta información, agrega una carga de memorización al lector.

int do_fancy(vector a, vector b); 

o

int do_fancy(vector *a, vector *b); 

en el primer caso que se puede perder fácilmente que esa función puede cambiar el contenido de una o b. En el segundo estoy advertido.

Y cuando realmente estoy escribiendo código, también sé directamente escribir a->x y no tener el compilador dime error: request for member x 'en algo que no es una estructura o unión`.

Lo sé, parece una cuestión de gusto personal, pero habiendo trabajado con una gran cantidad de código externo, puedo asegurarle que es extremadamente molesto cuando no reconoce el nivel de indirección de las variables. Esa es una razón por la que tampoco me gustan las referencias de C++ (en Java no es porque todos los objetos se pasan por referencia, es consistente) y el tipo de tipos de LPCSTR de Microsoft.

+6

+1 para la observación de que 'typedef struct {...} * obj' conduce a un tipo que misteriosamente requiere' -> 'en lugar de' .' para acceder a los elementos. – Michael

Cuestiones relacionadas