Frage

Ich versuche zu kompilieren LightZpng Mit Warnungen auf Stufe 4. bekomme ich viele C4127 in Zeilen, die dieser Warnung eindeutig nicht würdig sind. Ein Beispiel:

#define MAX_BITS 15
int values_per_bitlen[ MAX_BITS + 1 ];
for ( int i = 0; i <= MAX_BITS; ++i )    // C4127 is here
    values_per_bitlen[ i ] = 0;

Wie kann dieser Code geändert werden, um die andere Warnung als #pragma zu vermeiden?

War es hilfreich?

Lösung

Am oberen Rand von Lighttz.cpp befindet sich ein Stück Code, das so geht:

#define for if (false) {} else for

Das heißt, Ihre tatsächliche Aussage lautet:

#define for if (false) {} else for ( int i = 0; i <= MAX_BITS; ++i )

Deshalb erhalten Sie den ständigen Ausdrucksfehler (es ist das false, nicht der i <= MAX_BITS wie ich dachte).

Aus einfach herausnehmen oder diese Zeile aus der Datei löschen (ich kann nicht herausfinden, warum sie das tun würden).

Andere Tipps

Ja, das ist seltsam. Es ist wirklich nicht ein konstanter Ausdruck seitdem i Änderungen in der Schleife. Dies scheint also ein Problem mit VS2005 zu sein. Für das, was es wert ist, tut Vs2008 genau dasselbe.

Seltsamerweise ein Projekt mit nur Dies beschwert sich nicht, daher kann es ein seltsames Problem mit dem Microsoft-Warngenerierungscode sein:

#define MAX_BITS 15
int values_per_bitlen[ MAX_BITS + 1 ];
int main(int argc, char* argv[]) {
    for ( int i = 0; i <= MAX_BITS; ++i )
        values_per_bitlen[ i ] = 0;
    return 0;
}

Sie haben jedoch keine Frage gestellt. Was möchten Sie wissen oder wollen, dass wir tun?

Aktualisieren:

Siehe Antwort "Windows Programmer" für die tatsächliche Ursache - es gibt eine "#define for if (false) {} else for" oben in Lighttz.cpp, was das Problem verursacht.

Ich habe es auf meinem VS2005 getestet und die Warnung erscheint nicht, selbst bei Warnstufen 4.

Ein einfaches Verfahren, das Sie befolgen müssen:

-Erstellen Sie eine neue Konsolen -App und platzieren Sie nur den oben genannten Code und prüfen Sie, ob die Warnung erneut angezeigt wird.

-Wenn nicht nach Unterschieden in den Projekteinstellungen prüfen.

-Wenn ja, ich würde davon ausgehen, dass Ihre Optimierungseinstellung möglicherweise verursacht wird.

Laut Charles Nicholson, Visual Studio 2005 gibt diesen Fehler mit dem "do...while(0)"Trick:

#define MULTI_LINE_MACRO \
    do { \
        doSomething(); \
        doSomethingElse(); \
    } while(0)

Wenn Sie unbedingt müssen, können Sie die verwenden __PRAGMA Richtlinie zur selektiven Deaktivierung dieser Warnung um ein bestimmtes Codefragment.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top