-o zmienia nazwę pliku wyjściowego (odkryłem, że używając --help)
Ale nie mogę się dowiedzieć, co -Wall
robi?
-o zmienia nazwę pliku wyjściowego (odkryłem, że używając --help)
Ale nie mogę się dowiedzieć, co -Wall
robi?
man
wpisy programów, jeśli chcesz wiedzieć, co robi przełącznik lub jakie są dostępne. man
Strona gcc
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.
-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
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:
-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ć.
-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
Włącza wszystkie ostrzeżenia. (czyta jako „Ostrzeżenie dla wszystkich”)
-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.