5

Sto cercando di inizializzare una matrice 2D di utente tipo definito a zero utilizzando seguente rigaavviso quando si cerca di inizializzare un array di struct 2D con due liste di inizializzazione

qmf_t X_hybrid_left[32][32] = {{0}}; 

Dove qmf_t è un tipo definito dall'utente. Qui ho l'avviso del compilatore,

avvertimento:. Bretelle intorno inizializzazione mancante [-Wmissing-bretelle]"

Ma se io uso, qmf_t X_hybrid_left[32][32] = {{{0}}};, vale a dire 3 bretelle per lato, di avvertimento scompare

è corretto usare tre parentesi su ogni lato? che cosa significa?

+0

In questo caso sopprimerei l'avviso e scriverò il codice come '{0}' che è perfettamente a posto. – Lundin

risposta

12
qmf_t X_hybrid_left[32][32] = { /* Row initializers next */ 
           { /* Col initializers next */ 
            { /* Struct initializers next */ 
            0 
            } 
           } 
           }; 
qmf_t a = {0}; 
qmf_t b[5] = {{0}}; 
qmf_t c[10][5] = {{{0}}}; 

Dalle specifiche C11, 6.7.9 inizializzazione grammatica

initializer:
assegnazione espressione
{inizializzazione-list} {
inizializzatore-list,}

Anche se nel vostro caso particolare (azzeramento tutti gli oggetti di 2 matrici), qmf_t X_hybrid_left[32][32] = {0}; funzionerà come qmf_t X_hybrid_left[32][32] = {{{0}}}; ma il compilatore potrebbe avvisarti.

Ma se si desidera l'inizializzazione diversa da zero, è necessario utilizzare più parentesi.

Dalla stessa sezione:

[16] In caso contrario, l'inizializzatore di un oggetto che ha aggregato o tipo unione sarà una lista allegata tutore di initializers per gli elementi o denominati membri.

[20] Se l'aggregato o unione contiene elementi o membri che sono aggregati o sindacati, queste regole si applicano in modo ricorsivo alle subaggregates o unioni contenute. Se l'inizializzatore di una unione parziale o contenuta inizia con una parentesi graffa sinistra, gli inizializzatori racchiusi da quella controvente e la parentesi graffa destra corrispondente inizializzano gli elementi oi membri del sottoaggregato o l'unione contenuta . Altrimenti, solo gli inizializzatori sufficienti dall'elenco sono presi in considerazione per gli elementi oi membri del sottoaggregato o il primo membro dell'unione contenuta; eventuali rimanenti inizializzatori vengono lasciati per inizializzare l'elemento successivo o membro dell'aggregato di che l'unione parziale o unione corrente è una parte.

Problemi correlati