Nie możesz
Podręcznik dla GCC 4.4.0 jest wyczerpujący tylko dla tej wersji, ale zawiera listę wszystkich możliwych ostrzeżeń dla 4.4.0. Nie wszystkie znajdują się na stronie, do której prowadzi link, na przykład niektóre opcje specyficzne dla języka znajdują się na stronach opcji C ++ lub Obj-C. Aby znaleźć je wszystkie, lepiej spojrzeć na Podsumowanie opcji
Włączenie wszystkiego obejmowałoby to, -Wdouble-promotionco dotyczy tylko procesorów z 32-bitową jednostką zmiennoprzecinkową o pojedynczej precyzji, która implementuje się floatw sprzęcie, ale emuluje doublew oprogramowaniu. Wykonywanie obliczeń w doublesposób podobny do emulacji oprogramowania i wolniejsze. Jest to istotne w przypadku niektórych wbudowanych procesorów, ale zupełnie nie ma znaczenia w przypadku współczesnych procesorów do komputerów stacjonarnych ze sprzętową obsługą 64-bitowych liczb zmiennoprzecinkowych.
Innym ostrzeżeniem, które zwykle nie jest przydatne, jest -Wtraditionalostrzeżenie o doskonale uformowanym kodzie, który ma inne znaczenie (lub nie działa) w tradycyjnych C, np. W "string " "concatenation"definicjach funkcji ISO C! Czy naprawdę zależy Ci na kompatybilności z 30-letnimi kompilatorami? Czy na pewno chcesz ostrzeżenia do pisania int inc(int i) { return i+1; }?
Myślę, że -Weffc++jest zbyt głośny, aby był użyteczny, opiera się na przestarzałym pierwszym wydaniu Effective C ++ i ostrzega o konstrukcjach, które są całkowicie poprawne w C ++ (i dla których wytyczne zmieniły się w późniejszych wydaniach książki). Nie chcę być ostrzegł, że nie zainicjowałem std::stringczłonka w moim konstruktorze; ma domyślnego konstruktora, który robi dokładnie to, co chcę, dlaczego mam pisać, m_str()aby to nazwać? Te -Weffc++ostrzeżenia, które byłyby pomocne są zbyt trudne dla kompilator wykryć dokładnie (co daje fałszywie ujemne), a te, które nie są użyteczne, takie jak inicjowanie wszystkich członków jawnie, tylko produkować zbyt dużo hałasu, dając fałszywe alarmy.
Luc Danton podał świetny przykład bezużytecznych ostrzeżeń z -Waggregate-returntego, że prawie na pewno nigdy nie ma sensu dla kodu C ++.
tzn. tak naprawdę nie chcesz wszystkich ostrzeżeń, po prostu myślisz, że tak.
Przejrzyj instrukcję, przeczytaj o nich, zdecyduj, które chcesz włączyć, wypróbuj je. W każdym razie przeczytanie instrukcji kompilatora jest dobrą rzeczą. Skrócenie i włączenie ostrzeżeń, których nie rozumiesz, nie jest dobrym pomysłem, zwłaszcza jeśli chcesz uniknąć korzystania z RTFM.
Każdy, kto po prostu wszystko włącza, prawdopodobnie robi to, ponieważ nie ma pojęcia, bo albo spiczasty szef powiedział „bez ostrzeżeń”.
Niektóre ostrzeżenia są ważne, a niektóre nie. Musisz być dyskryminujący lub popsuć swój program. Rozważmy na przykład -Wdouble-promotion. Jeśli pracujesz w systemie wbudowanym, możesz tego chcieć; jeśli pracujesz na systemie stacjonarnym, prawdopodobnie nie. A chcesz -Wtraditional? Wątpię.
Edycja: Zobacz także -Wall-all, aby włączyć wszystkie ostrzeżenia, które są zamknięte jako WONTFIX.
Edycja 2: w odpowiedzi na skargę DevSolar dotyczącą plików makefile, które muszą używać różnych ostrzeżeń w zależności od wersji kompilatora, jeśli -Wall -Wextranie jest to odpowiednie, użycie CFLAGS specyficznych dla kompilatora i wersji:
compiler_name := $(notdir $(CC))
ifeq ($(compiler_name),gcc)
compiler_version := $(basename $(shell $(CC) -dumpversion))
endif
ifeq ($(compile_name),clang)
compiler_version := $(shell $(CC) --version | awk 'NR==1{print $$3}')
endif
# ...
wflags.gcc.base := -Wall -Wextra
wflags.gcc.4.7 := -Wzero-as-null-pointer-constant
wflags.gcc.4.8 := $(wflags.gcc.4.7)
wflags.clang.base := -Wall -Wextra
wflags.clang.3.2 := -Weverything
CFLAGS += $(wflags.$(compiler_name).base) $(wflags.$(compiler_name).$(compiler_version))