Visual Studio 2010 c ++编译器问题

Fer*_*eak 5 c++ compiler-errors visual-studio-2010

我有以下非常奇怪的情况...我的Visual Studio编译器2010不喜欢以下代码:

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

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

它给了我:

..\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'
Run Code Online (Sandbox Code Playgroud)

和截图:

VS2010错误

但是如果我将变量重命名为lst而不是lst2编译所有内容......

这是Visual Studio 2010中的一个有趣的错误(因为GCC不关心它)或者有更隐蔽的原因吗?

rod*_*igo 12

这些错误通常是与变量名称相同的意外宏的结果.有点谷歌会在Windows SDK标题中找到这一行Dlgs.h:

#define lst2        0x0461
Run Code Online (Sandbox Code Playgroud)

这就是我所说的名字污染!

我的猜测是,MS人认为使用每个对话框保持什么硬的控制不同的ID,所以他们虽然给人的名单任何对话框相同的ID: ,,lst1 ... .与任何其他类型的控制相同.但由于某种原因,这个想法没有抓住,标题被遗忘了.lst2lst3lst16Dlgs.h

现在,奇怪的是,此标头默认包含在VC++项目中,而不包含在GCC编译中.也许环境不一样.

  • @Angew:每个人都知道宏是邪恶的.但如果名为`WIN32_DLG_DEFAULT_LIST_2`的地方没人会关心.使用`lst2`作为宏名称是邪恶和愚蠢的. (2认同)