GCC-Schalter auf enum, behalten die fehlende Warnung, sondern Standard verwenden
GCC verwenden, wenn Sie switch
auf eine enum
Wert und eine der Enumerationen, die fehlt, ist ein case
- Anweisung eine Warnung ausgegeben wird. Wenn Sie hinzufügen, eine default
Element ist die Warnung nicht mehr ausgegeben werden, was Sinn macht im Allgemeinen Fall.
Gibt es einen Weg, um eine default
Anweisung und noch eine Warnung, falls nicht alle enum
Werte abgedeckt sind? Da meine Funktion befassen sich mit unreinen input, ich würde gerne über den generischen Fall aber immer noch compiler-Warnungen über fehlende eine enum-Fall.
Derzeit habe ich am Ende die Zuweisung einer default nach der switch-Anweisung.
Du musst angemeldet sein, um einen Kommentar abzugeben.
-Wswitch-enum, aber leider nur die aktuelle version unterstützt diese.
(Natürlich könnten Sie simulieren das Verhalten, das Sie wollen, indem Sie eine "goto" - außerhalb der switch und das weglassen der Standard, aber ich würde stark davon abraten, es ist hässlich und jemand anderes Lesen Ihr code wäre ein WTF-Erlebnis.)
#pragma GCC diagnostic warning "-Wswitch-enum"
könnte den trick tun. Lesen Sie mehr über ihn hierNach der Lektüre der link von "David Rodríguez - dribeas", dachte ich, es wäre hilfreich zu fassen die Optionen dort aufgelistet.
Gibt es zwei Möglichkeiten, dies zu tun - entweder schalten Sie die Nachrichten über fehlende enum Fällen für alle
switch
Aussagen, dann deaktivieren Sie es für die, die Sie nicht interessieren, oder lassen Sie die Standardeinstellung und die Kraft, die Fehler für dieseswitch
Aussagen, die Sie wirklich interessieren.Option 1: Warnungen für alle, daneben einige als Stille
Erste, hinzufügen
-Wswitch-enum
zu Ihrem compiler-flags, so dass alleswitch
Aussagen, auch diejenigen, die mit einemdefault
- Klausel, werden Warnungen generiert, falls ein enum wird nicht behandelt.Dann, für diejenigen, die
switch
Aussagen, wo Sie wollen, dass diedefault
Fall zu kümmern und Dinge nicht sehen wollen, Warnungen, wickeln Sie dieswitch
Aussage wie diese:Dies wird vorübergehend deaktivieren Sie die
-Wswitch-enum
flag (verstecken Sie die Warnungen über fehlende enum-Fälle), die nur für diese eine case-Anweisung.Option 2: Nur warnen, wenn Sie gekennzeichnet werden, um so zu tun
Da der Standard-GCC-Verhalten zu verstecken Warnungen, wenn ein
default
Klausel vorhanden ist, die compiler flags müssen nicht geändert werden, für diese option.Statt, für diejenigen, die
switch
Aussagen, die einedefault
- Klausel, aber Sie immer noch wollen, um zu sehen, Warnungen über fehlende enum Fällen, wickeln Sie dieswitch
wie diese:Diese vorübergehend ermöglicht die
-Wswitch-enum
Flagge zwischen denpush
undpop
Zeilen, dass Nachrichten über fehlende enum Fällen angezeigt, auch wenn eindefault
Klausel vorhanden ist. Sie können das Wort ändernwarning
zuerror
wenn Sie möchten, die Zusammenstellung scheitern an einem fehlenden Fall.Leider, Stand heute, weder gcc noch llvm erkennen kann Sie nicht vergleichen, werden alle Werte einer
enum
imswitch
wenn Sie einendefault
wechseln.default
- Klausel in dem Fall, dass Sie darauf hinweisen, dass es sinnvoll ist, einen Standard.Ich würde sagen, dass das Problem mehr an der
enum
Ebene.Was ich meine ist, sollten Sie zunächst überprüfen Sie Ihre Eingabe (dh stellen Sie sicher, dass es in der Tat anzeigen in real enum) und nur einmal validiert, sollten Sie den enum, in dem Fall der Standard wird damit überflüssig.
Zur Validierung der Eingaben, eine einfach Lösung, die ich verwenden, ist die Erstellung der enum durch ein makro, welches auch automatisch generieren konvertieren Funktionen: aus/an
string
vonint
(oder was auch immer).Beispiel:
Erzeugen könnte:
Es ist die einzige Möglichkeit die ich gefunden habe, zu generieren, diese leicht (obwohl die string-Konvertierung ist hier ein bisschen vereinfacht hier).
Andere Lösung wäre, verwenden Sie ein Skript zum erzeugen der source-code von einer anderen Datei.
EDIT: Mit dem Schalter Betrieb und Validierung
Die einfache Antwort ist (wie ich oben), damit das Programm flow aus dem Schalter anstelle der Verwendung einer default-Klausel. Dies ist möglich, wenn der normal-flow (wenn er in einem
case
) nicht am Ende fallen aus dem Schalter.default
- Klausel ist die eine, die fängt eine ungültige definition (und in der Regel wirft eine exception). Ich möchte vermeiden, dass ein extra Schalter, nur um zu überprüfen, wie es redundanten code zu pflegen.return
um zu verhindern, dass die Strömung von dem Sturz aus dem Schalter, auf diese Weise können Sie prüfen, die das Herausfallen der Schalter ist ein Fehler (das wäre normalerweise gehandhabt durchdefault
) und noch der compiler warnen, wenn es eine fehlendecase
. Wie Sie den Fehler beheben, ist bis zu Ihnen.Ein Grund wäre, dass Sie müssen in der Lage sein zu schreiben warning-freien code, ohne zu brechen Ihren Rücken. Wenn, zum Beispiel, müssen Sie ein enum mit 100 Konstanten, dann würden Sie Liste jede und jeder von Ihnen in jeder switch-Anweisung, auch wenn Sie nur benötigt, um prüfen eine Handvoll von Ihnen, wenn die Warnung funktionieren sollte, wie Sie vorgeschlagen.