2015-05-12 11 views
7

ho:l'inizializzazione diretta di una struttura in C

struct date 
{ 
int day; 
int month; 
int year; 
}; 

struct person { 
char name[25]; 
struct date birthday; 
}; 


struct date d = { 1, 1, 1990 }; 

inizializzazione con

struct person p1 = { "John Doe", { 1, 1, 1990 }}; 

opere.

Ma se provo

struct person p2 = { "Jane Doe", d}; 

ottengo un errore del tipo:

"data non può essere convertito in int".

Cosa c'è di sbagliato? d è una struct date e il secondo parametro dovrebbe essere anche una struct date. Quindi dovrebbe funzionare. Grazie e saluti

+1

possibile duplicato di [Inizializzazione struttura C con variabile] (http://stackoverflow.com/questions/7700878/c-structure-initialization-with-variable) – Kishore

risposta

6
struct person p2 = { "Jane Doe", d}; 

Può essere dichiarato in questo modo solo se la dichiarazione è a portata di blocco. Nell'ambito del file, sono necessari gli inizializzatori costanti (d è un oggetto e il valore di un oggetto non è un'espressione costante in C).

La ragione di questo è che un oggetto dichiarato al di file-scope senza classe di archiviazione specificatore ha una durata di stoccaggio statico e C dice:

(C11, 6.7.9p4) "Tutte le espressioni in un inizializzatore per un oggetto che ha durata di memorizzazione statica o thread deve essere espressioni costanti o stringhe letterali. "

In ambito di blocco senza identificatore di classe di memoria, l'oggetto ha durata di archiviazione automatica.