2011-11-16 14 views
5

tengo algo como:typedef stuct con declaración adelantada en C

typedef struct Data DATA, *DATA_PTR; 
typedef struct Units UNITS, *UNITS_PTR; 

struct Data 
{ 
    double miscData; 
    UNITS units; 
}; 

struct Units 
{ 
    double x[2]; 
    double y[2]; 
    double z[2]; 
}; 

en mi archivo project_typedef.h.

En otro archivo, que tienen algo así como:

void fileInput(DATA_PTR data) 
{ 
    //usual declarations and other things 
    data->miscData = 0; //Works! 
    data->units.x[0] = 5; //Doesn't work 
    //etc... 
} 

Sin embargo, esto no funciona ya que las unidades se declara después de datos en project_typedef.h (si cambio el orden en que trabaja). El error que recibo es "left of '.x' debe tener struct/union type". Pensé que la declaración directa solucionaría este problema. Por qué no?

+3

En primer lugar == parece extraño ... – Tudor

+0

@Tudor, un error tipográfico, pero no es así está en mi código. Está editado ahora. – user1007692

+3

Solo quiero decir que odio cuando veo tipos de punteros usados ​​como tipo normal. DATA_PTR no simplifica la escritura de código de ninguna manera, ya que todavía es puntero y aún tiene que usar -> operador. –

Respuesta

10

Cuando defineData, todos los miembros deben ser tipos completos. Dado que UNITS no es un tipo completo en ese punto, esto no funciona. (Por el contrario, UNITS_PTR habría ningún problema, ya que los punteros a tipos incompletas son tipos completos.)

En pocas palabras la definición anterior Units la definición Data y que debe estar bien.

(Como ya se ha señalado @cnicutar, que está también utilizando la matriz x mal.)

5

La declaración directa le permite usar su nombre en contexto donde se permite un tipo incompleto. Declarar que un miembro de la estructura no es uno de esos casos, se debe conocer la definición completa, ya que contribuye al diseño de la estructura.

1

No hay ningún prototipo de estructura. Esto se debe a que el compilador necesita conocer el tamaño de la estructura antes de usarla. Puede usar puntero en struct, porque los punteros tienen un tamaño conocido sin importar a qué tipo apuntan.

0

para una definición de estructura siempre se debe utilizar tipos completas para todos los miembros de una estructura ... pero esto no es el caso de UNITS units en struct Data, que declara una variable llamada units de tipo struct Units que nunca se declaró antes de la struct Datos ... esto refleja un error ... debe colocar la definición Units sobre la definición Data .. y todo funcionará bien ...

y con respecto a la declaración directa esto no funciona ya que cada vez que se define una variable struct, el compilador primero asigna la memoria requerida a la estructura (miembros de la estructura no tienen una memoria asignada a ellos, a menos que sean e vinculado a un tipo de estructura de la variable ... por eso las variables de estructura no se pueden inicializar dentro de la plantilla de estructura) .. :)