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.html

    Ich 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. 🙄


Anmelden zum Antworten