GCC: Probleme mit -Wno-switch-enum
-
Der gcc warnt vor swichtes über enum's, in denen nicht alle Aufzählungswerte behandelt werden. Das wird bei
-Wall
mit eingeschaltet. Ich will das aber gerade nicht, und ich will auch nicht alle anderen Warnungen abschalten. Dafür sollte-Wno-switch-enum
zuständig sein:
http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.htmlIch krieg das aber gerade nicht hin:
#include <stdio.h> int main(void) { enum {ONE, TWO, THREE} e = ONE; switch (e) { case ONE: puts("ONE"); break; case TWO: puts("TWO"); break; } return 0; }
Wenn ich die Datei mit
-Wall
und-Wno-switch-enum
übersetze, werde ich die Warnungen leider nicht los (-Wno-switch
hilft auch nicht):$ gcc -Wall -Wno-switch-enum main.c main.c: In function 'main': main.c:7: warning: enumeration value 'THREE' not handled in switch $ gcc --version gcc (Ubuntu 4.3.2-1ubuntu12) 4.3.2
Mach ich da was falsch?
-
Warum willst Du diese Warnung ausschalten
Mach doch noch zusätzlich zu -Wall noch -Wextra und -pedantic dazu...
-
..oder noch besser das ganze Zeug hier:
CXXFLAGS = -W CXXFLAGS += -Werror CXXFLAGS += -Wall CXXFLAGS += -Wextra CXXFLAGS += -Wabi CXXFLAGS += -Wreorder CXXFLAGS += -Weffc++ CXXFLAGS += -Wold-style-cast CXXFLAGS += -Wsign-promo CXXFLAGS += -Wformat-nonliteral CXXFLAGS += -Wformat-security CXXFLAGS += -Wformat=2 CXXFLAGS += -Winit-self CXXFLAGS += -Wuninitialized CXXFLAGS += -Wmissing-include-dirs CXXFLAGS += -Wswitch CXXFLAGS += -Wswitch-default CXXFLAGS += -Wswitch-enum CXXFLAGS += -Wunused-parameter CXXFLAGS += -Wunused CXXFLAGS += -Wunknown-pragmas CXXFLAGS += -Wstrict-overflow CXXFLAGS += -Wstrict-overflow=1 CXXFLAGS += -Wstrict-overflow=2 CXXFLAGS += -Wstrict-overflow=3 CXXFLAGS += -Wstrict-overflow=4 CXXFLAGS += -Wstrict-overflow=5 CXXFLAGS += -Wfloat-equal CXXFLAGS += -Wundef CXXFLAGS += -Wshadow CXXFLAGS += -Wunsafe-loop-optimizations CXXFLAGS += -Wpointer-arith CXXFLAGS += -Wcast-qual CXXFLAGS += -Wcast-align CXXFLAGS += -Wwrite-strings CXXFLAGS += -Wconversion CXXFLAGS += -Wsign-conversion CXXFLAGS += -Wlogical-op CXXFLAGS += -Waggregate-return CXXFLAGS += -Wmissing-field-initializers CXXFLAGS += -Wpacked CXXFLAGS += -Wpadded CXXFLAGS += -Wredundant-decls CXXFLAGS += -Wvolatile-register-var CXXFLAGS += -Winvalid-pch CXXFLAGS += -Wnormalized=nfkc CXXFLAGS += -Wsequence-point
:xmas1:
-
abc.w schrieb:
Warum willst Du diese Warnung ausschalten
Ich hab einen Interpreter, der die "Ver-switch-ung" eines enum-Typs auf 6 Funktionen aufteilt. Ich sorg schon dafür, dass kein Wert übergangen wird, und das will ich dem Compiler irgendwie sagen, sonst warnt er mir für jeden der 6 switches alle fehlenden Werte an, das gibt eine lange Liste.
abc.w schrieb:
..oder noch besser das ganze Zeug hier:
Sowas hab ich mir natürlich auch schon überlegt. Aber es muss doch gehen, dem Ding zu sagen: "mach mir alle Warnungen bis auf diese eine"; und nicht die Warnungen auszuschalten und dann alle anderen einzeln einzuschalten. Zumindest sagen die Docs, dass das geht, aber es will halt nicht hinhauen.
-
Hallo,
durchaus möglich, dass deine gcc-Version schon zu alt für die Interpretation von Wno-switch-enum ist.
MfG,
Probe-Nutzer
-
Probe-Nutzer schrieb:
durchaus möglich, dass deine gcc-Version schon zu alt für die Interpretation von Wno-switch-enum ist.
Ja, der ist nicht mehr der jüngste. Aber wenn ich den Schalter falsch schreibe, beschwert er sich über ein unbekanntes Argument:
$ gcc -Wall -Wno-swiiiitch-enum main.c main.c: In function 'main': main.c:7: warning: enumeration value 'THREE' not handled in switch At top level: cc1: error: unrecognized command line option "-Wno-swiiiitch-enum"
Ich will im nächsten Jahr sowieso das ganze System updaten, da kommt von selbst ein frischer Compiler drauf. Sonst funtioniert er ja gut, ist mir zu blöd, für die paar Wochen mit den Versionen herumzufrickeln.
Früher war's mal ganz egal, ob ein Compiler zwei Jahre alt ist.
Könnt ihr das Verhalten mit einer neueren Version reproduzieren?
-
-Wno-switch
ist was du suchst.Aber ich würde es eher so machen, wenn du weißt, dass du die anderen Labels ignorieren willst.
#include <stdio.h> int main(void) { enum {ONE, TWO, THREE} e = ONE; switch (e) { case ONE: puts("ONE"); break; case TWO: puts("TWO"); break; default: break; } return 0; }
Dann warnt dich der GCC immer noch in den Fällen, wo du es wirklich vergessen hast und der Code ist imho klarer.
-
-Wno-swiiiitch-enum
Willst du uns verarschen?
-
knivil schrieb:
-Wno-swiiiitch-enum
Willst du uns verarschen?
Willst du richtig lesen, was er schreibt? :p
-
rüdiger schrieb:
-Wno-switch
ist was du suchst.Aber ich würde es eher so machen, wenn du weißt, dass du die anderen Labels ignorieren willst.
...
Dann warnt dich der GCC immer noch in den Fällen, wo du es wirklich vergessen hast und der Code ist imho klarer.
So gehts. Danke schön!
So ein
default: break;
taugt immerhin als Hinweis, dass man sich was dabei gedacht hat, da hast du recht. Damit kann ich gut leben.
Taugt aber trotzdem als Satire:#ifdef __GNU_C default: break; #endif
-
Ich hab's erst jetzt verstanden. Mit
-Wno-swicht
geht's auch ohne default. Da hab ich scheinbar irgendwas beim Testen verbockt, ich war mir sicher, das ich das schon probiert hatte.