Das kannst du nicht.
Das Handbuch für GCC 4.4.0 ist nur für diese Version umfassend, enthält jedoch alle möglichen Warnungen für 4.4.0. Sie befinden sich jedoch nicht alle auf der Seite, auf die Sie verlinken. Einige sprachspezifische Optionen befinden sich beispielsweise auf den Seiten für C ++ - oder Obj-C-Optionen. Um sie alle zu finden, schauen Sie sich besser die Optionsübersicht an
Das Einschalten von allem würde Folgendes umfassen, -Wdouble-promotion
was nur für CPUs mit einer 32-Bit-Gleitkommaeinheit mit einfacher Genauigkeit relevant ist, die float
in Hardware implementiert , aber double
in Software emuliert wird . Berechnungen wie double
bei der Software-Emulation durchführen und langsamer sein. Dies ist für einige eingebettete CPUs relevant, für moderne Desktop-CPUs mit Hardwareunterstützung für 64-Bit-Gleitkomma jedoch völlig irrelevant.
Eine andere Warnung, die normalerweise nicht nützlich ist -Wtraditional
, warnt vor perfekt geformtem Code, der in herkömmlichen C-, z. B. "string " "concatenation"
oder ISO C-Funktionsdefinitionen eine andere Bedeutung hat (oder nicht funktioniert) ! Interessiert Sie die Kompatibilität mit 30 Jahre alten Compilern wirklich? Möchten Sie wirklich eine Warnung zum Schreiben int inc(int i) { return i+1; }
?
Ich denke, es -Weffc++
ist zu laut, um nützlich zu sein. Es basiert auf der veralteten ersten Ausgabe von Effective C ++ und warnt vor Konstrukten, die perfekt in C ++ gültig sind (und für die sich die Richtlinien in späteren Ausgaben des Buches geändert haben). Ich möchte es nicht sein warnte, dass ich kein std::string
Mitglied in meinem Konstruktor initialisiert habe; Es hat einen Standardkonstruktor, der genau das tut, was ich will. Warum sollte ich schreiben m_str()
, um es aufzurufen? Die -Weffc++
Warnungen, die hilfreich wären, sind für den Compiler zu schwierig, um sie genau zu erkennen (falsche Negative), und diejenigen, die nicht nützlich sind, wie das explizite Initialisieren aller Mitglieder, erzeugen einfach zu viel Rauschen und geben falsche Positive.
Luc Danton lieferte ein großartiges Beispiel für nutzlose Warnungen -Waggregate-return
, die für C ++ - Code mit ziemlicher Sicherheit nie Sinn machen.
dh du willst nicht wirklich alle Warnungen, du denkst nur, dass du es tust.
Lesen Sie das Handbuch durch, lesen Sie mehr darüber, entscheiden Sie, welche Sie aktivieren möchten, und probieren Sie sie aus. Lesen Handbuch des Compilers ist eine gute Sache TM wie auch immer, eine Abkürzung zu nehmen und damit Warnungen Sie nicht verstehen , ist nicht eine sehr gute Idee, vor allem , wenn es um RTFM zu vermeiden ist.
Jeder, der einfach alles anmacht, tut dies wahrscheinlich entweder, weil er keine Ahnung hat, oder weil ein spitzer Chef "keine Warnungen" sagte.
Einige Warnungen sind wichtig, andere nicht. Sie müssen diskriminieren oder Sie bringen Ihr Programm durcheinander. Betrachten Sie zum Beispiel , -Wdouble-promotion
. Wenn Sie an einem eingebetteten System arbeiten, möchten Sie dies möglicherweise. Wenn Sie an einem Desktop-System arbeiten, tun Sie dies wahrscheinlich nicht. Und wollen Sie -Wtraditional
? Ich bezweifle das.
Bearbeiten: Siehe auch -Wall-all, um alle Warnungen zu aktivieren, die als WONTFIX geschlossen sind.
Bearbeiten 2: Als Reaktion auf die Beschwerde von DevSolar, dass Makefiles je nach Compilerversion unterschiedliche Warnungen verwenden müssen, -Wall -Wextra
ist es nicht schwierig, compilerspezifische und versionenspezifische CFLAGS zu verwenden , wenn dies nicht geeignet ist:
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))