Co robi „-Wall” w „g ++ -Wall test.cpp -o test”?

92

-o zmienia nazwę pliku wyjściowego (odkryłem, że używając --help)

Ale nie mogę się dowiedzieć, co -Wallrobi?

Steven
źródło
7
"man gcc" na twojej konsoli mówi ci wszystko o tej fladze i prostym wyszukiwaniu w Google z "gcc -Wall", a także ...
David Sauter
Jako ogólną wskazówkę, spróbuj przeczytać manwpisy programów, jeśli chcesz wiedzieć, co robi przełącznik lub jakie są dostępne. manStrona gccmożna przeczytać na linux.die.net/man/1/gcc - można zrobić szybkie wyszukiwanie tam na tekst „-Wall”
gnud
6
@David Sauter, Google nie znajdzie niczego z „-wall”. Spowoduje to wykluczenie wszystkich „ścian” z wyszukiwania.
Kirill V. Lyadvinsky,
@Kirill Nie, jeśli używasz cudzysłowów, tak jak zgaduję David wredny
gnud
1
//, zawsze myślałem, że to hołd dla Larry'ego Wall'a.
Nathan Basanese

Odpowiedzi:

110

Skrót od „ostrzeż wszystkich” - włącza (prawie) wszystkie ostrzeżenia, o których może powiedzieć g ++. Zazwyczaj jest to dobry pomysł, zwłaszcza jeśli jesteś początkującym, ponieważ zrozumienie i naprawienie tych ostrzeżeń może pomóc w naprawieniu wielu różnych rodzajów problemów w kodzie.

MatrixFrog
źródło
24
Więcej ostrzeżeń (z których niektóre są całkiem przydatne) można włączyć za pomocą -Wextrai -pedantic.
gnud
7
To nie (prawie) wszystko. W rzeczywistości jest to tylko niewielka część dostępnych ostrzeżeń. To te, z którymi „wszyscy” się zgadzają. Naprawdę dobrym pomysłem jest to zrobić -Wall -Wextra, a następnie czytać instrukcji, aby znaleźć jak najwięcej więcej ostrzeżeń można umożliwiających jak to możliwe, bo nawet -Wextrato tylko niewielki podzbiór ...
DevSolar
@DevSolar bardzo dobra uwaga. Czy wiesz, czy jest flaga, która oznacza „dosłownie wszystkie ostrzeżenia”?
MatrixFrog
1
@MatrixFrog: Niestety nie ma takiej opcji, przynajmniej nie dla kompilatorów, które znam. A lista dostępnych ostrzeżeń zmienia się z czasem ... gdyby zespół GCC nie wyłączył -Wunreachable-codejakiegoś czasu temu, Apple byłby znacznie szczęśliwszy w dzisiejszych czasach. ;-)
DevSolar
36

Zobacz man gcc.

-Ściana włącza te ostrzeżenia:

-Waddress -Warray-bounds (only with -O2) -Wc++0x-compat -Wchar-subscripts
-Wenum-compare (in C/Objc; this is on by default in C++) -Wimplicit-int (C and
 Objective-C only) -Wimplicit-function-declaration (C and Objective-C only) 
-Wcomment -Wformat -Wmain (only for C/ObjC and unless -ffreestanding) 
-Wmissing-braces -Wnonnull -Wparentheses -Wpointer-sign -Wreorder -Wreturn-type 
-Wsequence-point -Wsign-compare (only in C++) -Wstrict-aliasing 
-Wstrict-overflow=1 -Wswitch -Wtrigraphs -Wuninitialized -Wunknown-pragmas 
-Wunused-function -Wunused-label -Wunused-value -Wunused-variable 
-Wvolatile-register-var

-Wextra zawiera:

-Wclobbered -Wempty-body -Wignored-qualifiers -Wmissing-field-initializers
-Wmissing-parameter-type (C only) -Wold-style-declaration (C only) -Woverride-init
-Wsign-compare -Wtype-limits -Wuninitialized -Wunused-parameter (only with -Wunused
 or -Wall) -Wunused-but-set-parameter (only with -Wunused or -Wall)

Jest o wiele więcej ostrzeżeń, które musisz wyraźnie włączyć.

Np. Dla naszego kodu C używamy:

-Wall -Wextra -Waggregate-return -Wcast-align -Wcast-qual -Wdisabled-Optimization -Wdiv-by-zero -Wendif-labels -Wformat-extra-args -Wformat-nonliteral -Wformat-security -Wformat-y2k -Wimplicit -Wimport -Winit-self -Winline -Winvalid-pch -Wjump-misses-init -Wlogical-op -Werror = missing-braces -Wmissing-declarations -Wno-missing-format-attribute -Wmissing-include-dirs -Wmultichar -Wpacked -Wpointer-arith -Wreturn-type -Wsequence-point -Wsign-compare -Wstrict-aliasing -Wstrict-aliasing = 2 -Wswitch -Wswitch-default -Werror = undef -Wno-unused -Wvariadic-macros -Wwrite-strings -Wc ++ -compat -Werror = deklaracja-po-instrukcji -Werror = niejawna-deklaracja-funkcji -Wmissing-prototypes -Werror = nested-externs -Werror = old-style-definition -Werror = strict-prototypes

lub tylko zestaw ostrzeżeń z https://www.gnu.org/software/autoconf-archive/ax_compiler_flags.html

rurban
źródło
19

Niestety żadna z odpowiedzi nie jest cytowaniem odpowiedniej części instrukcji, co tak naprawdę prowadzi do sedna:

Włącza to wszystkie ostrzeżenia o konstrukcjach, które niektórzy użytkownicy uważają za wątpliwe i które można łatwo uniknąć (lub zmodyfikować, aby zapobiec ostrzeżeniu), nawet w połączeniu z makrami.

[…]

Zauważ, że niektóre flagi ostrzegawcze nie są implikowane przez -Wall. Niektóre z nich ostrzegają przed konstrukcjami, których użytkownicy generalnie nie uważają za wątpliwe, ale które czasami możesz chcieć sprawdzić; inne ostrzegają o konstrukcjach, których w niektórych przypadkach trzeba lub trudno uniknąć, i nie ma prostego sposobu na zmodyfikowanie kodu w celu pominięcia ostrzeżenia. Niektóre z nich są włączane przez, -Wextra ale wiele z nich musi być włączanych indywidualnie.

Ergo:

  • -Wallnie nie znaczy „wszystkie ostrzeżenia”.
  • Robi też nie myśli „(prawie) wszystko”, a nie przez długie ujęcie.
  • To nie znaczy, zbiór poszczególnych opcji , który jest zobowiązany do zmiany .

Podsumowując, chodzi o absolutne minimum ostrzeżeń, które powinieneś ustawić. Chociaż -Wall -Wextrajest lepsze, nadal nie wykorzystuje wszystkich błędów, które może wykonać sprawdzanie przez kompilator.


Osobiście nie wybrałbym mniej niż -Wall -Wextra -Wfloat-equal -Wundef -Wcast-align -Wwrite-strings -Wlogical-op -Wmissing-declarations -Wredundant-decls -Wshadow -Woverloaded-virtual. We wszystkich moich bieżących projektach lista ostrzeżeń jest dłuższa niż ta (bez wyzwalania żadnego z nich). I sprawdzam podręcznik każdego głównego wydania, aby znaleźć nowe opcje. Kompilator to twój przyjaciel. Skorzystaj z wszelkiej diagnostyki, jaką może ci zaoferować.

DevSolar
źródło
Zacząłem uczyć się programowania w C ++. Korzystam z zasad programowania i ćwiczę korzystanie z cpp . Mój system to ubuntu 16.04, używam vscode jako mojego edytora. Czy polecasz mi używanie twojego, -Wall -Wextra -Wfloat-equal -Wundef -Wcast-align -Wwrite-strings -Wlogical-op -Wmissing-declarations -Wredundant-decls -Wshadow -Woverloaded-virtualgdy kompiluję, g++ -std=c++11podczas gdy uczę się C ++ i programowania? A może powinienem pominąć tę część i później zacząć używać flag komunikatów o błędach? Jeśli tak, kiedy powinienem zacząć od komunikatów o błędach?
scientific_explorer
2
@vkv: Uważam, że kompilator jest naprawdę twoim przyjacielem i powinieneś skorzystać z każdej dobrej rady, jaką może ci dać.
DevSolar
6

Włącza ostrzeżenia, które są uważane za przydatne i łatwe do uniknięcia u źródła przez autorów gcc. Istnieje również -W (-Wextra w nowszych wersjach), które są uważane za przydatne, ale w przypadku których obejście fałszywych alarmów może być trudne lub skutkować niezgrabnym kodem.

gcc ma również kilka innych ostrzeżeń, ogólnie mniej przydatnych. Zobacz http://gcc.gnu.org/onlinedocs/gcc-4.4.3/gcc/Warning-Options.html#Warning-Options

AProgrammer
źródło
2

To enables most warning messages.

Możesz dowiedzieć się więcej, jeśli używasz g++ --help=warnings.

Yuval
źródło
0

Włącza wszystkie ostrzeżenia. (czyta jako „Ostrzeżenie dla wszystkich”)

Bjorn J.
źródło
W rzeczywistości istnieje wiele ostrzeżeń, których nie włącza (na przykład nie wirtualny dtor w klasie z metodami wirtualnymi).
Mark B
zobacz odpowiedź Yuvala: -Walloznacza po prostu „większość ostrzeżeń” zamiast „wszystkie ostrzeżenia”.
HaxtraZ
-1

Pokazuje wszystkie ostrzeżenia. Poleciłbym również -pedanticostrzec o niektórych niezgodnych częściach kodu.

Kirill V. Lyadvinsky
źródło
W przypadku gcc doc: „Niektórzy użytkownicy próbują używać -pedantic do sprawdzania programów pod kątem ścisłej zgodności z ISO C. Wkrótce odkrywają, że nie robi tego, czego chcą: znajduje pewne praktyki inne niż ISO, ale nie wszystkie - tylko te, dla których ISO C wymaga diagnostyki, a kilka innych, dla których dodano diagnostykę ”.
AProgrammer
Nie daje 100% gwarancji, ale pomaga.
Kirill V. Lyadvinsky,
1
Gdybyś nie napisał kilku zamiast wszystkich w „ostrzeżeniu o wszystkich niezgodnych z wymogami częściach”, nie skomentowałbym. Ale twoje obecne sformułowanie po prostu rozpowszechnia błędne przekonanie, przed którym ostrzega dokumentacja gcc.
AProgrammer,
Naprawiony. Ale w praktyce wygląda to raczej na „większość”, a nie „trochę”.
Kirill V. Lyadvinsky,