5

我有以下非常奇怪的情况......我的 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);
    }

它给了我:

..\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'

和截图:

VS2010 错误

但是,如果我将变量重命名为lst而不是lst2一切都编译...

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

4

2 回答 2

12

这类错误通常是与变量同名的意外宏的结果。有点谷歌会在 Windows SDK 标头中找到你这一行Dlgs.h

#define lst2        0x0461

这就是我所说的名字污染

我的猜测是,MS 人认为为每个对话框的控件使用不同的 ID 很难维护,因此他们认为为任何对话框的列表提供相同的 ID:lst1, lst2, lst3... lst16。与任何其他类型的控件相同。但由于某种原因,这个想法没有被抓住,Dlgs.h标题被遗忘了。

现在,奇怪的是这个头文件默认包含在你的 VC++ 项目中,而不是你的 GCC 编译中。可能环境不一样吧。

于 2013-09-23T10:00:05.837 回答
0

看起来您已经有了一个名为 lst 的变量,它的类型为 int。是的,我同意它看起来像是编译器的错误,因为您在一个新的变量空间中,其中包含 if(secondStep){} 包装。

于 2013-09-23T09:59:51.977 回答