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?


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.


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


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ć.


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


2

To enables most warning messages.

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


0

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


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.


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,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.