热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

由引起的bug~

编程经验:一个由引起的bug~文章一 转自:http:www.mamicode.cominfo-detail-506772.html1.问题描述最近遇到一个莫
编程经验:一个由引起的bug~

文章一

  转自:http://www.mamicode.com/info-detail-506772.html

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 

#include 

#include 

#include 

#if !defined(_MAC) ||defined(_WIN32NLS)

#include 

#endif

#ifndef _MAC

#include 

#include 

#endif

#if !defined(_MAC) ||defined(_WIN32REG)

#include 

#endif

#ifndef _MAC

#include 

#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). 这样莫名其妙的错误,往往是头文件被重复包含的原因,仔细查看头文件即可。查找办法,肯定是先看看出错的文件在那个文件中被包含过,一层一层的去找。

 

文章二

error C2146: 语法错误 : 缺少“;”(在标识符“PVOID64”的前面)

  转自:http://itsdf.blog.51cto.com/2255425/1106989

在用vs2008编译一个dx8项目遇到编译错误:

c:\program files\microsoft sdks\windows\v6.0a\include\winnt.h(236) : error C2146: 语法错误 : 缺少“;”(在标识符“PVOID64”的前面)
c:\program files\microsoft sdks\windows\v6.0a\include\winnt.h(236) : error C4430: 缺少类型说明符 – 假定为 int。注意: C++ 不支持默认 int
c:\program files\microsoft sdks\windows\v6.0a\include\winnt.h(7818) : error C2146: 语法错误 : 缺少“;”(在标识符“Buffer”的前面)
c:\program files\microsoft sdks\windows\v6.0a\include\winnt.h(7818) : error C4430: 缺少类型说明符 – 假定为 int。注意: C++ 不支持默认 int
c:\program files\microsoft sdks\windows\v6.0a\include\winnt.h(7818) : error C4430: 缺少类型说明符 – 假定为 int。注意: C++ 不支持默认 int

网上有人说是vs的include顺序问题,也有人说既然是找不到PVOID64加个typedef就行了。经过本人的试验发现,的确是vs的include顺序问题,调整include顺序保证dx目录在sdk目录的下面即可解决问题。下面记录步骤: 1、在vs中,选择 工具->选项->项目和解决方案->VC++ 目录,在 显示以下内容的目录 选择 包含文件,确保条目 $(WindowsSdkDir)\include 和 $(FrameworkSDKDir)include 在任何dx目录的前面。如果没有dx目录也ok(指的不会有这个错误)。如下图:  

《由<Windows.h>引起的bug~》&#8221; /></p><p> 2、在vs的解决方案资源管理器中右键相应的项目,选择属性,在属性窗口的 配置属性 -> C/C++ -> 常规 中的 附加包含目录,点击其右边的小按钮,在弹出的附加包含目录中,确保条目 $(WindowsSdkDir)\include 和 $(FrameworkSDKDir)include 在任何dx目录的前面。如下图:    </p><p><img layer-src= var cpro_id = "u6885494";

推荐阅读
  • 深入解析Java虚拟机(JVM)架构与原理
    本文旨在为读者提供对Java虚拟机(JVM)的全面理解,涵盖其主要组成部分、工作原理及其在不同平台上的实现。通过详细探讨JVM的结构和内部机制,帮助开发者更好地掌握Java编程的核心技术。 ... [详细]
  • 在高并发需求的C++项目中,我们最初选择了JsonCpp进行JSON解析和序列化。然而,在处理大数据量时,JsonCpp频繁抛出异常,尤其是在多线程环境下问题更为突出。通过分析发现,旧版本的JsonCpp存在多线程安全性和性能瓶颈。经过评估,我们最终选择了RapidJSON作为替代方案,并实现了显著的性能提升。 ... [详细]
  • 本文将详细介绍多个流行的 Android 视频处理开源框架,包括 ijkplayer、FFmpeg、Vitamio、ExoPlayer 等。每个框架都有其独特的优势和应用场景,帮助开发者更高效地进行视频处理和播放。 ... [详细]
  • 本文详细介绍了一种通过MySQL弱口令漏洞在Windows操作系统上获取SYSTEM权限的方法。该方法涉及使用自定义UDF DLL文件来执行任意命令,从而实现对远程服务器的完全控制。 ... [详细]
  • 深入解析Spring启动过程
    本文详细介绍了Spring框架的启动流程,帮助开发者理解其内部机制。通过具体示例和代码片段,解释了Bean定义、工厂类、读取器以及条件评估等关键概念,使读者能够更全面地掌握Spring的初始化过程。 ... [详细]
  • 通常情况下,修改my.cnf配置文件后需要重启MySQL服务才能使新参数生效。然而,通过特定命令可以在不重启服务的情况下实现配置的即时更新。本文将详细介绍如何在线调整MySQL配置,并验证其有效性。 ... [详细]
  • ElasticSearch 集群监控与优化
    本文详细介绍了如何有效地监控 ElasticSearch 集群,涵盖了关键性能指标、集群健康状况、统计信息以及内存和垃圾回收的监控方法。 ... [详细]
  • 为了解决不同服务器间共享图片的需求,我们最初考虑建立一个FTP图片服务器。然而,考虑到项目是一个简单的CMS系统,为了简化流程,团队决定探索七牛云存储的解决方案。本文将详细介绍使用七牛云存储的过程和心得。 ... [详细]
  • 深入解析 Android IPC 中的 Messenger 机制
    本文详细介绍了 Android 中基于消息传递的进程间通信(IPC)机制——Messenger。通过实例和源码分析,帮助开发者更好地理解和使用这一高效的通信工具。 ... [详细]
  • Python自动化测试入门:Selenium环境搭建
    本文详细介绍如何在Python环境中安装和配置Selenium,包括开发工具PyCharm的安装、Python环境的设置以及Selenium包的安装方法。此外,还提供了编写和运行第一个自动化测试脚本的步骤。 ... [详细]
  • 本文详细探讨了如何通过分析单个或多个线程在瓶颈情况下的表现,来了解处理器资源的消耗。无论是单进程还是多进程环境,监控关键指标如线程数量、占用时间及调度优先级等,有助于揭示潜在的性能问题。 ... [详细]
  • HTML基础入门指南
    本文将深入浅出地介绍HTML的基础知识,包括其定义、开发工具、制定机构、特性、基本标签及更多实用内容。 ... [详细]
  • Android Studio 中查看应用程序崩溃日志的方法
    本文介绍如何在 Android Studio 中配置环境变量并使用 ADB 工具查看应用程序的崩溃日志,帮助开发者快速定位和解决问题。 ... [详细]
  • 如何使用 CleanMyMac X 2023 激活码解锁完整功能
    本文详细介绍了如何使用 CleanMyMac X 2023 激活码解锁软件的全部功能,并提供了一些优化和清理 Mac 系统的专业建议。 ... [详细]
  • 解决MacOS上Android Studio Gradle版本不匹配问题
    在MacOS系统中,升级Android Studio后可能会遇到Gradle版本不兼容的问题。当网络下载更新受阻时,可以使用本地已安装的Gradle版本来解决问题。本文将详细介绍如何配置本地Gradle环境以确保开发工作的顺利进行。 ... [详细]
author-avatar
mofa007_903
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有