2010-01-18 5 views
6

alt C/C++ Code Aufräumen, die anstelle von Aufzählungen fest codierten Ganzzahlliterale verwendet wird, ist es mühsam zu finden, wo die Funktion Deklaration aber nicht den Körper richtig Refactoring ist. z.B.Gibt es einen c/C++ - Compiler, der eine Warnung (oder einen Fehler) oder eine enum-Konvertierung in int ausgeben kann?

enum important { 
    little = 1, 
    abit = 2, 
    much = 3 
}; 

void blah(int e) 
{ 
    // magic stuff here 
} 

void boing(int e) { ... } 

void guck(important e) 
{ 
    switch (e) { 
    case 3: // this would be a good place for a warning 
     blah(e); // and this 
     break; 
    default: 
     boing((int)e); // but this is OK (although imperfect and a warning would be acceptable) 
     break; 
    } 
} 

Beschriften/jeder Aufzählungstyp zu ändern oder durch den Code der Suche nach ihnen auch eine Menge Arbeit sein würde, da es sehr sehr viele verschiedene Aufzählungen sind, so ist dies nicht bevorzugt, könnte aber eine akzeptable Lösung sein.

Ich brauche es nicht in einem unserer Haupt-Compiler oder anderen Tools (gcc meist) oder Plattform (die meisten), es manuell ein paar Mal laufen würde ausreichen, aber ich würde etwas bevorzugen, das ist nicht zu esoterisch oder teuer.

+0

Hat Griffe diese nicht perfekt gcc? Ich benutze g ++ und sehe immer die beschriebenen Warnungen. Verhält sich reiner C-Compiler anders? – Basilevs

+0

Nein, kompiliere diesen Code (minus ... und plus eine leere main()) mit: g ++ -Wall test.cpp gibt 0 Warnungen. Die Promotion von int zu enum wird für gewarnt, aber nicht umgekehrt. Wenn Sie andersherum arbeiten, geben Sie mir bitte Ihre Befehlszeile. bitte ... –

Antwort

1

Flusen werden für Dich diese Warnung zur Verfügung stellen (Zustand 641)

641 Enum Konvertieren in int - Ein Aufzählungstyp wurde in einem Kontext verwendet, dass eine Berechnung erforderlich, wie ein Argument zu einem arithmetischen Operator oder wurde mit einem ganzzahligen Argument verglichen. Diese Warnung wird unterdrückt werden, wenn Sie die ganze Zahl Modell der Aufzählung verwenden (+ fie), aber Sie werden dabei einige wertvolle Art Kontrolle zu verlieren. Eine Zwischenrichtlinie besteht darin, diese Warnung einfach auszuschalten. Die Zuweisung von int zu enum wird weiterhin abgefangen.

Splint (http://www.splint.org/download.html) ist ein modernes Flusen Sie

+0

ja, für den kleineren c-teil, leider haben wir C++ style kommentare so splint kotzt sofort, ich nehme an ich könnte sed diese weg. Sie kennen OK C++ fähig oder ignorieren Flusen? –

1

Sparse (ein semantisches Checker Tool vom Linux-Kernel Menschen verwendet wird) verwenden können, können Sie mit einigen dabei helfen.

Eine Untergruppe von Aufzählungsfehler können durch diese Optionen gefangen werden: -Wenum-Mismatch, -Wcast-truncate. Wie auch immer, ich habe deinen Code durchgespielt und es sieht nicht so aus, als wären alle von denen erwischt worden.

Dies ist freie Software, sollten Sie wollen, sie verlängern.

Verwandte Themen