5

próbuję zainicjować 2D tablicę użytkownika określonego typu do zera stosując następujący wiersz,Ostrzeżenie, gdy próbuje zainicjować tablicę struct 2D z dwóch list initializer

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

Gdzie qmf_t jest typ zdefiniowanej przez użytkownika. Tutaj pojawia się ostrzeżenie kompilatora,

ostrzegawcze. Brakuje nawiasów wokół inicjatora [-Wmissing-szelki]”

Ale jeśli mogę użyć, qmf_t X_hybrid_left[32][32] = {{{0}}};, czyli 3 szelki z każdej strony, ostrzeżenie znika

Czy to prawidłowe użycie trzech szelki z każdej strony? Co to znaczy?

+0

W tym przypadku po prostu pomijam ostrzeżenie i piszę kod jako '{0}', który jest idealnie w porządku. – Lundin

Odpowiedz

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}}}; 

Od specyfikacji C11, 6.7.9 Inicjowanie gramatyka

Inicjator:
zadanie wyrażanie
{initializer-list} {
inicjalizator-list}

Chociaż w danym przypadku (zerowanie wszystkie obiekty z 2 tablic), qmf_t X_hybrid_left[32][32] = {0}; będzie działać tak samo jak qmf_t X_hybrid_left[32][32] = {{{0}}};, ale kompilator może ostrzegać.

Ale jeśli chcesz inicjacji niezerowej, musisz użyć wielu nawiasów klamrowych.

Z tej samej sekcji:

[16] W przeciwnym razie, inicjator dla obiektu, który ma łącznie lub typ unia powinna być zamknięta lista klamra z inicjalizatory dla elementów lub nazwanych członków.

[20] Jeżeli kruszywo lub unia zawiera elementy lub członków, które są kruszywa lub związki, reguły te stosuje rekurencyjnie do subaggregates lub zawartych związków. Jeśli inicjalizator podagregowanego lub zawartego połączenia rozpoczyna się lewym nawiasem, inicjatory zawarte w tym klamrze i dopasowany prawy wspornik inicjują elementy lub elementy podagregatu lub zjednoczonego złącza. W przeciwnym razie, tylko wystarczająca liczba inicjatorów z listy jest wzięta pod uwagę dla elementów lub członków subagregatu lub pierwszego członka zawartego związku; wszelkie pozostałe inicjatory zostały pozostawione, aby zainicjować następny element lub element agregatu o numerze , którego częścią jest aktualnie podagregowane lub zawarte zworki.