c++ - Visual Studio 2010 c++ 编译器问题

标签 c++ visual-studio-2010 compiler-errors

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

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

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

最佳答案

这些类型的错误通常是与您的变量同名的意外宏造成的。稍微谷歌一下就会在 Windows SDK header Dlgs.h 中找到这一行:

#define lst2        0x0461

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

我的猜测是 MS 人员认为对每个对话框的控件使用不同的 ID 很难维护,因此他们虽然给 any 对话框列表提供了相同的 ID:lst1lst2lst3 ... lst16。与任何其他类型的控件相同。但由于某种原因,这个想法没有被接受,Dlgs.h header 被遗忘了。

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

关于c++ - Visual Studio 2010 c++ 编译器问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18956296/

相关文章:

compiler-errors - gfortran 编译双复变量的问题

c - 以下c程序的编译时错误的正确解释是什么

c++ - 返回对变量 : Meaningful/useful? 的引用

asp.net - ASP.NET详细信息 View -编辑为空值错误

java - 无法解析符号 Intent - 是否导入 Intent

silverlight - 向 WP7 应用程序添加外部字体

c# - MSTest、MyClassInitialize 和实例变量

c++ - 跨 dll 边界的内存分配和释放

c++ - 如何使用 std::conditional 选择一个自由函数

c++ - 使用可变参数宏生成数组