2011-11-16 12 views
5

ho qualcosa di simile:typedef stuct con dichiarazione anticipata in 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]; 
}; 

nel mio file project_typedef.h.

In un altro file, ho qualcosa di simile:

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

Tuttavia, questo non funziona in quanto unità è dichiarata dopo che i dati in project_typedef.h (se posso passare l'ordine funziona). L'errore che ottengo è "left of" .x "deve avere struct/union type". Pensavo che la dichiarazione anticipata avrebbe risolto il problema. Perchè no?

+3

Prima di tutto che == sembra strano ... – Tudor

+0

@Tudor, un errore di battitura, ma non è così è nel mio codice. È stato modificato ora. – user1007692

+3

Voglio solo dire che odio quando vedo i tipi di puntatore usati come normali. DATA_PTR non semplifica la scrittura del codice in alcun modo poiché è ancora puntatore e devi ancora usare l'operatore ->. –

risposta

10

Quando si imposta Data, tutti i membri devono essere tipi completi. Dal momento che UNITS non è un tipo completo a quel punto, questo non funziona. (Al contrario, UNITS_PTRsarebbe bene, dal momento che i puntatori ai tipi incompleti sono tipi complete.)

In poche parole la definizione Units sopra la definizione Data e si dovrebbe andare bene.

(Come @cnicutar già notato, si sta anche utilizzando la matrice x sbagliata.)

5

La dichiarazione di inoltro consente di utilizzare il suo nome nel contesto in cui è consentito un tipo incompleto. Dichiarare un membro struct non è uno di questi casi, la definizione completa deve essere nota in quanto contribuisce al layout della struct.

1

Non c'è prototipo per struct. Questo perché il compilatore deve conoscere la dimensione della struct prima di usarlo. È possibile utilizzare il puntatore su struct, perché i puntatori hanno dimensioni note indipendentemente dal tipo a cui puntano.

0

per una definizione struct si dovrebbe sempre utilizzare i tipi di completi per tutti i membri di una struttura ... ma questo non è il caso di UNITS units in struct Data, che dichiara una variabile denominata units di tipo struct Units che non viene mai dichiarata prima della struct I dati ... questo riflette un errore .. si dovrebbe porre la definizione Units sopra Data definizione .. e tutto funzionerà bene ..

e relativo avanti dichiarazione questo non funziona in quanto ogni volta che viene definita una variabile struct, il compilatore prima assegna la memoria richiesta alla struttura (i membri della struttura donot hanno una memoria assegnata a loro, a meno che non E collegato a un tipo di struct di variabile .. ecco perché le variabili struct non possono essere inizializzate all'interno di struct template .. :)

Problemi correlati