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: