2012-11-29 19 views
16

Estensione da questo questionChe tipo di dichiarazione è questa?

Ho problemi a capire questo codice.

struct foo myfoo; // --> Is it forward declaration or object creation. ? 

struct foo 
{ 
int a; 
}; 

int main() 
{ 

return 0; 
} 

Nel codice contrassegnato con la freccia --> È la dichiarazione diretta o la creazione dell'oggetto. ?

Se la dichiarazione è avanti, cosa viene chiamato struct foo;? Se si tratta di creazione o istanziazione di oggetti, come può creare un oggetto prima della definizione della struct.

Il compilatore gcc funziona correttamente ma un altro compilatore restituisce un errore.

gcc -Werror -Wall tst.c -o tst 

Qualche suggerimento o spiegazione su questo comportamento di gcc? Non avrei potuto trovarlo da nessuna parte come documentato.

+0

non ho avuto la possibilità di guardare lo standard C99, quindi non sono ancora sicuro se è specificato da qualche parte, +1. – iabdalkader

+0

@melpomene: ho concordato – Omkant

+0

@melpomene, o forse una funzione? Sembra che capisca che la struttura è definita nello stesso file in seguito. – Shahbaz

risposta

16

Sembra una definizione provvisoria di myfoo e poiché viene fornita la definizione della struttura non si ottiene alcun errore.

clang fornisce una diagnostica completa quando il tipo in non definito.

[email protected]:~$ cat tst.c 
struct foo myfoo; 

//struct foo{ 
// int x ; 
//} ; 

int main() 
{ 
} 
[email protected]:~$ clang tst.c 
tst.c:1:12: error: tentative definition has type 'struct foo' that is never 
     completed 
struct foo myfoo; 

non credo che la sua un bug gcc, clang così come comeau online è la compilazione del codice.

$ 6.9.2/2

Una dichiarazione di un identificatore per un oggetto che ha presentare portata senza un inizializzatore, e senza un identificatore classe di archiviazione o con l'identificatore di storage di classe statica, costituisce un definizione provvisoria. Se un'unità di traduzione contiene una o più definizioni provvisorie per un identificatore e l'unità di traduzione non contiene alcuna definizione esterna per quell'identificatore, allora il comportamento è esattamente come se l'unità di traduzione contenga una dichiarazione dell'ambito di file di quell'identificatore , con tipo composito a partire dalla fine della unità di traduzione, con un inizializzatore pari a 0.


+4

Buona presa, C99 6.9.2/2. È stato difficile (quando sei abituato al C++ in generale). – netcoder

+0

È strano come lo standard non menzioni la struct nel loro esempio (nemmeno in C11). – Shahbaz

-2
struct foo myfoo; 

Questa è una definizione C variabile di tipo foo chiamato myfoo. C richiede di specificare esplicitamente lo struct davanti alle dichiarazioni variabili struct.

Ora il tuo codice non dovrebbe essere compilato perché il compilatore non ha idea del posto che hai definito il tuo myfoo, che tipo di foo assomiglia. Il compilatore dovrebbe lamentarsi di foo come tipo incompleto.

EDIT:

rottami che, questo sarebbe chiamato un tentativo di definizione.

+5

Non penso che tu abbia letto completamente la domanda. – Shahbaz

+0

Le definizioni sperimentali finiscono "con il tipo composito alla fine dell'unità di traduzione" in §6.9.2/2, credo che questo sia quello che abbiamo nella domanda. – Mat

+0

Quale "modalità di compatibilità"? definizioni provvisorie sono descritte nello standard C. – Mat

Problemi correlati