Vermeiden Sie falsch-positive -Wswitch-Warnungen

8

Lassen Sie uns eine Liste von Werten (foo.lst) haben:

%Vor%

Lassen Sie uns daraus ein enum machen

%Vor%

Verwenden wir diese Enumeration in switch :

%Vor%

(Dieser Code ist dumm, aber ignoriere das einfach)

Das Problem:
Mit -Wswitch (in -Wall enthalten) warnen GCC und Clang (und wahrscheinlich andere):

  

Warnung: Aufzählungswert '_foo_length' wird nicht in switch [-Wswitch]

behandelt

Lösungen:

  • Durch das Deaktivieren von -Wno-switch wird diese Warnung ausgeblendet.
    Nachteil: Wir verlieren Warnungen über andere fehlende case vom Switch.
  • Hinzufügen eines default: unreachable(); -Falls.
    Nachteil: Wir verlieren Kompilierungswarnungen von fehlenden Fällen, zugunsten eines Laufzeitabsturzes, wenn wir jemals einen der fehlenden Fälle beim Debuggen treffen.
  • Ersetzen Sie den letzten Wert der Enumeration durch #define _foo_length (baz + 1) und machen Sie ihn nicht mehr zur Enumeration.
    Nachteil: Es erfordert, dass define jedes Mal manuell aktualisiert wird, wenn ein Wert zur Liste hinzugefügt wird. Jemand wird immer vergessen, alles zu brechen.

Idealerweise sollte es einen Weg geben, den Wert eines enum als nicht zuweisbar zu markieren , damit es beim Lesen der möglichen Werte keine Warnung im Compiler erzeugt und dieser nicht da ist. ohne dass ein Präprozessor-Makro benötigt wird, das doppelte Änderungen benötigt.

Gibt es so etwas? Irgendeine andere Option, an die ich nicht gedacht habe?

    
1ace 26.08.2016, 16:35
quelle

1 Antwort

2

Verwenden Sie

%Vor%

, damit alle Fälle behandelt werden. Sie könnten ein Makro dafür erstellen, damit es nicht so ausführlich ist.

    
Barmar 28.08.2016, 20:07
quelle

Tags und Links