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-promotion
co dotyczy tylko procesorów z 32-bitową jednostką zmiennoprzecinkową o pojedynczej precyzji, która implementuje się float
w sprzęcie, ale emuluje double
w oprogramowaniu. Wykonywanie obliczeń w double
sposó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 -Wtraditional
ostrzeż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::string
czł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-return
tego, ż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 -Wextra
nie 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))