2013-09-23 17 views
5

Ho la seguente situazione molto strana ... il mio compilatore Visual Studio 2010 non piace il seguente pezzo di codice:Visual Studio 2010 C++ compiler problema

QStringList lst2 = instantiatedTableInstances.split(strComma, skipper); 

    for(int i=0; i<lst2.size(); i++) 
    { 
     TableInstance* tabInst= v->getTableInstance(lst2.at(i)); 
     result->addInstantiatedTableInstance(tabInst); 
    } 

mi dà:

..\src\DeserializationFactory.cpp(1196) : error C2143: syntax error : missing ';' before 'constant' 
..\src\DeserializationFactory.cpp(1196) : error C2440: '=' : cannot convert from 'QStringList' to 'int' 
    No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called 
..\src\DeserializationFactory.cpp(1198) : error C2228: left of '.size' must have class/struct/union 
    type is 'int' 
..\src\DeserializationFactory.cpp(1200) : error C2228: left of '.at' must have class/struct/union 
    type is 'int' 

e uno screenshot:

VS2010 error

MA se cambio titolo la variabile lst invece di lst2 tutto viene compilato ...

È questo un bug divertente in Visual Studio 2010 (perché GCC non si preoccupa di esso), o c'è una ragione più nascosto per questo?

+0

Verificare che lst2 non sia già definito/dichiarato/macro nell'ambito. – user2672165

+1

lst2 è una macro. Dallo screenshot sembra che abbia un colore diverso, che dovrebbe dargli via – relaxxx

+1

Suggerimento: corretto definendo 'WIN32_LEAN_AND_MEAN'. – MSalters

risposta

12

Questi tipi di errori sono solitamente il risultato di una macro imprevista con lo stesso nome della variabile. Un po 'di google ti troverà questa riga nell'intestazione di Windows SDK Dlgs.h:

#define lst2  0x0461 

Questo è quello che io chiamo nome inquinamento!

La mia ipotesi è che MS gente pensava che l'utilizzo di un ID diverso per i controlli di ogni finestra ciò che difficile da mantenere, e così anche di dare le liste dei qualsiasi dialogo gli stessi ID: lst1, lst2, lst3. .. lst16. E lo stesso con qualsiasi altro tipo di controllo. Ma per qualche motivo l'idea non è stata presa e l'intestazione Dlgs.h è stata dimenticata.

Ora, la cosa strana è che questa intestazione è inclusa di default nel progetto VC++ e non nella compilation GCC. Forse l'ambiente non è lo stesso.

+0

Mi hai battuto su di esso; avere un +1. * Esempio di esempio * di ciò che è sbagliato con i macro. – Angew

+2

@Angew: Tutti sanno che le macro sono malvagie. Ma se fosse chiamato "WIN32_DLG_DEFAULT_LIST_2" a nessuno sarebbe importato. Usare 'lst2' come nome macro è malvagio e stupido. – rodrigo

+0

Il preprocessore definito in "" è in uso. Sono le costanti simboliche per gli ID di controllo utilizzati nelle finestre di dialogo comuni (come la finestra di dialogo Apri file). Se si desidera personalizzare una finestra di dialogo comune, sono necessari tali ID (vedere [Procedure hook stile Explorer] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms646960.aspx#_win32_Explorer_Style_Hook_Procedures)) . Inoltre, non è possibile assegnare un ID diverso a ogni controllo in ogni finestra di dialogo. Gli ID di controllo sono limitati a 16 bit. – IInspectable

0

sembra che tu abbia già una variabile chiamata lst, che ha un tipo di int. sì, sono d'accordo sembra un errore del compilatore, dato che ci si trova in un nuovo spazio variabile con if (secondStep) {} incartato.

Problemi correlati