2012-11-05 13 views
5

Chcę zainicjować wszystkich członków struct 0. wspólnego rozwiązania jest to, aby coś takiego:członków zainicjować struct do 0 (gcc -Wextra)

struct foo bar = {0} 

tworzę ten przykład:

#include <stdio.h> 

struct Stru2 { 
    int c; 
    int d; 
}; 

struct Stru1 { 
    int a; 
    Stru2 b; 
}; 

int main() 
{ 
    struct Stru1 aaa = { 0 }; 
    return aaa.b.c; 
} 

I skompilować (gcc 4.6.3) to odrobina to parametry, aby upewnić się, jak sobie z tym poradzić ANSI

gcc -Wall -Wextra -pedantic -ansi main.cpp 

I mam następujące ostrzeżenia:

main.cpp: In function ‘int main()’: 
main.cpp:36:28: warning: missing initializer for member ‘Stru1::b’ [-Wmissing-field-initializers] 

Pytanie brzmi, dlaczego -Wextra, generuje to ostrzeżenie? Może nie zawsze "= {0}", ustawić wszystkich członków na 0?

+0

Czy generuje również ostrzeżenie po zainicjowaniu za pomocą '{}'? (To byłaby bardziej idiomatyczna forma, jak sądzę.) –

+0

Dlaczego po prostu nie używać memsetu? –

+3

@JamesKanze: inicjalizacja '{}' jest nieprawidłowa C. – pmg

Odpowiedz

12

To tylko ostrzeżenie dla niania. = {0} zdecydowanie ustawia wszystkich członków na zero. Powodem, dla którego jest to ostrzeżenie w ogóle, jest przypadek, w którym możesz dodać pole do struktury i chcesz się upewnić, że zostanie poprawnie zainicjowany. Posiadanie ostrzeżenia pozwala szybko znaleźć te miejsca i je naprawić. Na przykład, powiedzmy, że naprawić mieć coś initializer jak:

struct Stru1 aaa = { 1, { 2, 3 } }; 

Teraz dodać pole int e do Stru2:

struct Stru2 { 
    int c; 
    int d; 
    int e; 
}; 

I udawajmy, że to bardzo ważne, że e się zainicjowany. Cóż, bez numeru -Wmissing-field-initializers musisz szukać w swoim kodzie, aby znaleźć każde ważne miejsce. Z ostrzeżeniem, otrzymasz komunikat diagnostyczny, jak ten, który widział, a można znaleźć i naprawić je bardzo łatwo:

struct Stru1 aaa = { 1, { 2, 3, 4 } }; 

Aby uzyskać korzyści z tego ostrzeżenia, to trzeba przejść i całkowicie zainicjować wszystko waszych struktur. W twoim przypadku, to znaczy, coś takiego:

struct Stru1 aaa = { 0, { 0, 0 } }; 
+1

'-Wextra' ma inne ostrzeżenia" niania "oprócz tego. Czasem są denerwujące, ale czasami autor kodu może być dla nich bardzo wdzięczny. –

+0

+1 @DavidHammen. Podoba mi się również wykrywanie przypadkowego użycia '=' zamiast '==' w warunkowych. Nie wiem, czy to jedna z rodzin '-Wextra', czy też nie, ale to fajna rzecz. –

+0

To jest ostrzeżenie '-Wparentheses', które jest włączone przez' -Wall'. –

Powiązane problemy