您的位置:首页 > 编程语言

编程经验:一个由windows.h&&winbase.h引起的bug~

2015-03-09 16:43 411 查看

1. 问题描述

最近遇到一个莫名其妙的bug,上网查找,没有找到正确的解决办法,难道大家都没遇到?于是我说一说自己是怎么解决的。

我用的是VS2010,一个解决方案下,添加了多个他人的项目,各个项目配置都使用了库文件(A.lib),编译,唯独其中一个项目,出现了如下错误提示:

错误 26 error C2040: “LPCH”:“int”与“int *”的间接寻址级别不同 c:\program files (x86)\microsoftsdks\windows\v7.0a\include\winbase.h 3539

错误 32 error C2059: 语法错误:“)” c:\program files (x86)\microsoftsdks\windows\v7.0a\include\winbase.h 3564

错误 37 error C2061: 语法错误: 标识符“LPCH” c:\program files (x86)\microsoftsdks\windows\v7.0a\include\winbase.h 14149

错误 36 error C2061: 语法错误: 标识符“PLONG” c:\program files (x86)\microsoftsdks\windows\v7.0a\include\winbase.h 4990

错误 50 error C2061: 语法错误: 标识符“PLONG” c:\program files (x86)\microsoftsdks\windows\v7.0a\include\winreg.h 742

错误 51 error C2061: 语法错误: 标识符“PLONG” c:\program files (x86)\microsoftsdks\windows\v7.0a\include\winreg.h 751

错误 1 error C2143: 语法错误 : 缺少“;”(在“*”的前面) c:\program files (x86)\microsoftsdks\windows\v7.0a\include\winnt.h 424

错误 6 error C2143: 语法错误 : 缺少“;”(在“*”的前面) c:\program files (x86)\microsoftsdks\windows\v7.0a\include\winnt.h 489

错误 9 error C2143: 语法错误 : 缺少“;”(在“*”的前面) c:\program files (x86)\microsoftsdks\windows\v7.0a\include\winnt.h 490

错误 24 error C2143: 语法错误 : 缺少“;”(在“__stdcall”的前面) c:\program files (x86)\microsoftsdks\windows\v7.0a\include\winbase.h 3539

错误 28 error C2146: 语法错误: 缺少“)”(在标识符“NewEnvironment”的前面) c:\program files (x86)\microsoftsdks\windows\v7.0a\include\winbase.h 3564

错误 52 error C2371: “SHORT”: 重定义;不同的基类型 c:\program files (x86)\microsoftsdks\windows\v7.0a\include\wtypes.h 382

错误 31 error C2440: “初始化”: 无法从“int *”转换为“BOOL” c:\program files (x86)\microsoftsdks\windows\v7.0a\include\winbase.h 3564

错误 35 error C2440: “初始化”: 无法从“int *”转换为“BOOL” c:\program files (x86)\microsoftsdks\windows\v7.0a\include\winbase.h 3582

错误 34 error C2491: “FreeEnvironmentStringsA”: 不允许 dllimport数据 的定义 c:\program files (x86)\microsoftsdks\windows\v7.0a\include\winbase.h 3582

错误 30 error C2491: “SetEnvironmentStringsA”: 不允许 dllimport数据 的定义 c:\program files (x86)\microsoftsdks\windows\v7.0a\include\winbase.h 3564

错误 48 error C2665: “InterlockedCompareExchange”: 2 个重载中没有一个可以转换所有参数类型 c:\program files(x86)\microsoft sdks\windows\v7.0a\include\winbase.h 15393

错误 49 error C2665: “InterlockedCompareExchange”: 3 个重载中没有一个可以转换所有参数类型 c:\program files(x86)\microsoft sdks\windows\v7.0a\include\winbase.h 15404

错误 40 error C2665: “InterlockedDecrement”: 2 个重载中没有一个可以转换所有参数类型 c:\program files(x86)\microsoft sdks\windows\v7.0a\include\winbase.h 15262

错误 41 error C2665: “InterlockedDecrement”: 3 个重载中没有一个可以转换所有参数类型 c:\program files(x86)\microsoft sdks\windows\v7.0a\include\winbase.h 15271

错误 42 error C2665: “InterlockedExchange”: 2 个重载中没有一个可以转换所有参数类型 c:\program files(x86)\microsoft sdks\windows\v7.0a\include\winbase.h 15294

错误 43 error C2665: “InterlockedExchange”: 3 个重载中没有一个可以转换所有参数类型 c:\program files(x86)\microsoft sdks\windows\v7.0a\include\winbase.h 15304

错误 44 error C2665: “InterlockedExchangeAdd”: 2 个重载中没有一个可以转换所有参数类型 c:\program files(x86)\microsoft sdks\windows\v7.0a\include\winbase.h 15328

错误 45 error C2665: “InterlockedExchangeAdd”: 2 个重载中没有一个可以转换所有参数类型 c:\program files(x86)\microsoft sdks\windows\v7.0a\include\winbase.h 15338

错误 46 error C2665: “InterlockedExchangeAdd”: 3 个重载中没有一个可以转换所有参数类型 c:\program files(x86)\microsoft sdks\windows\v7.0a\include\winbase.h 15348

错误 47 error C2665: “InterlockedExchangeAdd”: 3 个重载中没有一个可以转换所有参数类型 c:\program files(x86)\microsoft sdks\windows\v7.0a\include\winbase.h 15358

错误 38 error C2665: “InterlockedIncrement”: 2 个重载中没有一个可以转换所有参数类型 c:\program files(x86)\microsoft sdks\windows\v7.0a\include\winbase.h 15231

错误 39 error C2665: “InterlockedIncrement”: 3 个重载中没有一个可以转换所有参数类型 c:\program files(x86)\microsoft sdks\windows\v7.0a\include\winbase.h 15240

错误 12 error C2733: 不允许重载函数“_bittest”的第二个 C 链接 c:\program files (x86)\microsoftsdks\windows\v7.0a\include\winnt.h 3656

错误 13 error C2733: 不允许重载函数“_bittestandcomplement”的第二个 C 链接 c:\program files (x86)\microsoftsdks\windows\v7.0a\include\winnt.h 3662

错误 15 error C2733: 不允许重载函数“_bittestandreset”的第二个 C 链接 c:\program files (x86)\microsoftsdks\windows\v7.0a\include\winnt.h 3674

错误 14 error C2733: 不允许重载函数“_bittestandset”的第二个 C 链接 c:\program files (x86)\microsoftsdks\windows\v7.0a\include\winnt.h 3668

错误 18 error C2733: 不允许重载函数“_InterlockedAnd16”的第二个 C 链接 c:\program files (x86)\microsoftsdks\windows\v7.0a\include\winnt.h 3770

错误 17 error C2733: 不允许重载函数“_interlockedbittestandreset”的第二个 C 链接 c:\program files (x86)\microsoftsdks\windows\v7.0a\include\winnt.h 3686

错误 16 error C2733: 不允许重载函数“_interlockedbittestandset”的第二个 C 链接 c:\program files (x86)\microsoftsdks\windows\v7.0a\include\winnt.h 3680

错误 19 error C2733: 不允许重载函数“_InterlockedCompareExchange16”的第二个 C 链接 c:\program files (x86)\microsoftsdks\windows\v7.0a\include\winnt.h 3777

错误 20 error C2733: 不允许重载函数“_InterlockedOr16”的第二个 C 链接 c:\program files (x86)\microsoftsdks\windows\v7.0a\include\winnt.h 3783

错误 2 error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int c:\program files (x86)\microsoftsdks\windows\v7.0a\include\winnt.h 424

错误 3 error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int c:\program files (x86)\microsoftsdks\windows\v7.0a\include\winnt.h 424

错误 4 error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int c:\program files (x86)\microsoftsdks\windows\v7.0a\include\winnt.h 424

错误 5 error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int c:\program files (x86)\microsoftsdks\windows\v7.0a\include\winnt.h 424

错误 7 error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int c:\program files (x86)\microsoftsdks\windows\v7.0a\include\winnt.h 489

错误 8 error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int c:\program files (x86)\microsoftsdks\windows\v7.0a\include\winnt.h 489

错误 10 error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int c:\program files (x86)\microsoftsdks\windows\v7.0a\include\winnt.h 490

错误 11 error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int c:\program files (x86)\microsoftsdks\windows\v7.0a\include\winnt.h 490

错误 25 error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int c:\program files (x86)\microsoftsdks\windows\v7.0a\include\winbase.h 3539

错误 27 error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int c:\program files (x86)\microsoftsdks\windows\v7.0a\include\winbase.h 3542

2. 问题原因

其实完全可以忽略最后几条错误,每次找bug,都应该重点关注最开始的几个,后面的bug,很可能是编译器不够完美的原因。经过观察,发现问题出现在winbase.h文件,这就奇怪了,这个头文件是系统文件,不会有任何问题,于是就查找winbase.h的位置,发现其在windows.h中被包含过,而后者是经常被使用的头文件。
windows.h中的相关代码如下所示:

#include
<windef.h>
#include
<winbase.h>
#include
<wingdi.h>
#include
<winuser.h>
#if !defined(_MAC) ||defined(_WIN32NLS)
#include
<winnls.h>
#endif
#ifndef
_MAC
#include
<wincon.h>
#include
<winver.h>
#endif
#if !defined(_MAC) ||defined(_WIN32REG)
#include
<winreg.h>
#endif
#ifndef
_MAC
#include
<winnetwk.h>
#endif

此时,问题已经显而易见了,肯定是windows.h与winbase.h冲突的原因,更进一步,原因是winbase.h被重复包含了。

3. 问题解决

他人的项目中,肯定引用了winbase.h头文件,不能改他人的项目,那只能改正自己的A.lib了,结果发现A.lib中的头文件,包含了windows.h,赶紧将其放入cpp文件中,重新编译,通过!!!
或者对A.lib中的windows.h,进行预编译限制,也可以解决。

4.总结

1). 看bug就看最开始的几个,前面几个解决了,后面的bug往往自动消失。
2). 不要怀疑系统文件,千锤百炼的东西,不会轻易有问题,问题出在自己身上。

3). 这样莫名其妙的错误,往往是头文件被重复包含的原因,仔细查看头文件即可。查找办法,肯定是先看看出错的文件在那个文件中被包含过,一层一层的去找。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐