"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.
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ć.
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
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.
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ę”.
man
wpisy programów, jeśli chcesz wiedzieć, co robi przełącznik lub jakie są dostępne.man
Stronagcc
można przeczytać na linux.die.net/man/1/gcc - można zrobić szybkie wyszukiwanie tam na tekst „-Wall”Odpowiedzi:
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.
źródło
-Wextra
i-pedantic
.-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-Wextra
to tylko niewielki podzbiór ...-Wunreachable-code
jakiegoś czasu temu, Apple byłby znacznie szczęśliwszy w dzisiejszych czasach. ;-)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
źródło
Niestety żadna z odpowiedzi nie jest cytowaniem odpowiedniej części instrukcji, co tak naprawdę prowadzi do sedna:
Ergo:
-Wall
nie nie znaczy „wszystkie ostrzeżenia”.Podsumowując, chodzi o absolutne minimum ostrzeżeń, które powinieneś ustawić. Chociaż
-Wall -Wextra
jest 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ć.źródło
-Wall -Wextra -Wfloat-equal -Wundef -Wcast-align -Wwrite-strings -Wlogical-op -Wmissing-declarations -Wredundant-decls -Wshadow -Woverloaded-virtual
gdy kompiluję,g++ -std=c++11
podczas 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?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
źródło
To
enables most warning messages
.Możesz dowiedzieć się więcej, jeśli używasz
g++ --help=warnings
.źródło
Włącza wszystkie ostrzeżenia. (czyta jako „Ostrzeżenie dla wszystkich”)
źródło
-Wall
oznacza po prostu „większość ostrzeżeń” zamiast „wszystkie ostrzeżenia”.Pokazuje wszystkie ostrzeżenia. Poleciłbym również
-pedantic
ostrzec o niektórych niezgodnych częściach kodu.źródło