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.
Muchas gracias que tiene mucho sentido. –
... y tal vez 'const * S1CPTR'. – alecov
Solo para confirmar que entiendo. Es eso equivalente a 'typedef struct {...} S1; typedef S1 * S1PTR; '? – DCShannon