C e C++:inizializzazione parziale della struttura automatica

C e C++:inizializzazione parziale della struttura automatica


Ad esempio, se somestruct ha tre membri interi, ho sempre pensato che fosse OK farlo nella funzione C (o C++):


somestruct s = {123,};

Il primo membro verrebbe inizializzato a 123 e gli ultimi due verrebbero inizializzati a 0. Spesso faccio la stessa cosa con gli array automatici, scrivendo int arr[100] = {0,}; in modo che tutti gli interi in una matrice siano inizializzati a zero.




Recentemente ho letto nel Manuale di riferimento di GNU C che:





Qualcuno può dirmi cosa dicono gli standard C e C++ per quanto riguarda la struttura automatica parziale e l'inizializzazione automatica dell'array? Eseguo il codice sopra in Visual Studio senza problemi, ma voglio essere compatibile con gcc/g++ e forse anche con altri compilatori. Grazie


Risposte:


La documentazione collegata di gcc non parla di inizializzazione parziale parla solo di inizializzazione (completa) o Nessuna inizializzazione .



Gli standard non definiscono l'inizializzazione parziale degli oggetti, o c'è Inizializzazione completa o Nessuna inizializzazione. L'inizializzazione parziale è una terminologia non standard che si riferisce comunemente a una situazione in cui vengono forniti alcuni inizializzatori ma non tutti, ad esempio:un numero inferiore di inizializzatori rispetto alla dimensione dell'array o al numero di elementi della struttura inizializzati.


Esempio:


int array[10] = {1,2};                    //Case 1:Partial Initialization


Inizializzazione significa fornire un valore iniziale alla variabile creata contemporaneamente alla sua creazione. cioè:nella stessa istruzione di codice.


Esempio:


int array[10] = {0,1,2,3,4,5,6,7,8,9};    //Case 2:Complete Initialization
int array[10]; //Case 3:No Initialization

Il paragrafo citato descrive il comportamento per Case 3 .


Le regole relative all'inizializzazione parziale(Case 1 ) sono ben definiti dallo standard e queste regole non dipendono dal tipo di archiviazione della variabile da inizializzare.

AFAIK, tutti i compilatori tradizionali sono conformi al 100% a queste regole.




Gli standard C e C++ garantiscono che anche se un array intero si trova nella memoria automatica e se sono presenti meno inizializzatori in un elenco racchiuso tra parentesi graffe, gli elementi non inizializzati devono essere inizializzato su 0 .


Standard C99 6.7.8.21




In C++ le regole sono stabilite con una piccola differenza.


C++03 Standard 8.5.1 Aggregati

Paragrafo 7:



Mentre l'inizializzazione del valore è definita in,

Inizializzatori C++03 8.5

Paragrafo 5: