Domanda

Sto cercando di compilare LightZPng con avvisi al livello 4. ho un sacco di C4127 su linee che non sono chiaramente degno di questo avviso. Un esempio:

#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;

Come può questo codice essere modificato per evitare l'altro avvertimento che #pragma?

È stato utile?

Soluzione

C'è un pezzo di codice nella parte superiore di LightZ.cpp che va in questo modo:

#define for if (false) {} else for

Ciò significa che la dichiarazione reale è:

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

ed è per questo che stai ricevendo l'errore espressione costante (è la false, non il i <= MAX_BITS come pensavo).

È sufficiente lasciare un commento, o eliminare quella riga dal file (non riesco davvero a capire perché dovrebbero farlo).

Altri suggerimenti

Sì, che la sua strana. E 'veramente non un'espressione costante in quanto i cambiamenti i nel ciclo. Quindi questo sembra essere un problema con VS2005. Per quel che vale, VS2008 fa esattamente la stessa cosa.

Stranamente, un progetto con solo questo in esso non si lamenta così può ben essere qualche strano problema edge-caso con il codice di generazione gli avvisi di Microsoft:

#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;
}

Tuttavia, si è in realtà non ha fatto una domanda. Cos'è che vuoi sapere, o vuoi che facciamo?

Aggiornamento:

Vedere "programmatore di Windows" 's risposta per la vera causa -. C'è un "#define for if (false) {} else for" in cima alla LightZ.cpp che sta causando il problema

L'ho provato sulla mia VS2005 e l'avviso non appare, anche a livello di avviso 4..

Una semplice procedura per voi da seguire:

-Creare una nuova applicazione Console e posto solo il codice di cui sopra e vedere se l'avviso presenta di nuovo.

-Se non, verificare la presenza di differenze nelle impostazioni del progetto.

-Se sì, vorrei assumere che l'impostazione di ottimizzazione può essere la causa di esso.

Secondo Charles Nicholson , Visual Studio 2005 dà questo errore con il trucco "do...while(0)":

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

Se è assolutamente necessario, è possibile utilizzare il __pragma direttiva per disabilitare selettivamente che avvisi attorno ad un particolare frammento di codice.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top