2013-06-15 5 views
6

Czy w GCC jest jakakolwiek flaga (na przykład -Wempty-body w klangu), która może mi pomóc wykryć średniki po nawiasach pętli while/for? Czasami ludziom trudno jest znaleźć te proste błędy.Wykrywanie średnika po pętli/jeśli jest to nawias

int i = 0; 
for (i = 0; i < 10; ++i); 
{ 
    cout << i << endl; 
} 

Używam GCC 4.7.3 i klang 3.2-1 ~ exp9ubuntu1.

Edytowane: Sprawdzam również, czy kompilatory mogą mi pomóc znaleźć te błędy po "stwierdzeniach if-else".

if (i == 0) 
{ 
    cout << i << endl; 
} 
else; 
{ 
    cout << i << endl; 
} 

Co ciekawe gcc jest bardziej pomocny niż brzękiem (z tej flagi (-Wall -pedantic -Wempty-body) drukując ostrzeżeniem:

main.cpp:30:9: warning: suggest braces around empty body in an ‘else’ statement [-Wempty-body] 
+0

możliwe duplikat [Can gcc dokładnie złapać bezużyteczne warunki?] (http://stackoverflow.com/questions/851162/can-gcc-accurately-catch-useless-conditionals) –

+1

Po drugie myśli, to nie duplikat, przepraszam. Jednak nie jest "-Wempty-body" również flaga GCC? –

+6

Wydaje mi się, że jest to bardzo dobry powód (tj. Inny niż styl) do umieszczania początku '{' w tej samej linii co 'if' /' for'/'while' itd. I mieć jedno-liniowce na tej samej linii także. – Kninnug

Odpowiedz

2

spróbować foo.c

$ gcc -Wempty ciała

lub

gcc -Wextra -c foo.c

+3

To nie działa dla gcc/g ++ 4.7.2 (a przynajmniej na moim komputerze nie działa) – FDinoff

1

Oczywistą odpowiedzią jest tutaj „skompilować kod z brzękiem ++” (chociaż moja wersja 2.9 dla x86-64 nie wydaje się złapać tego konkretnego problemu, tak jak gcc 4.6.3 go nie łapie - więc nie jestem całkowicie przekonany, że pierwotne przesłanie pytania jest prawidłowe).

Ten konkretny kod można uniknąć tego problemu za pomocą formularza, podając błąd za korzystanie i po for -loop sobie:

for(int i = ...) 

zamiast

int i; 
for(i = ...) 

oczywiście, że nie działa w przypadku, gdy chcesz, aby i miał wartość po pętli.

[I tak, jest to bardzo przykry błąd - Spędziłem kilka godzin, wpatrując się w ekran, aby znaleźć tego rodzaju błędów w czasie - innym razem na miejscu natychmiast]