引起的bug~


編程經驗:一個由<Windows.h>引起的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 <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). 這樣莫名其妙的錯誤,往往是頭文件被重復包含的原因,仔細查看頭文件即可。查找辦法,肯定是先看看出錯的文件在那個文件中被包含過,一層一層的去找。

 

文章二

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(指的不會有這個錯誤)。如下圖:
 

2、在vs的解決方案資源管理器中右鍵相應的項目,選擇屬性,在屬性窗口的 配置屬性 -> C/C++ -> 常規 中的 附加包含目錄,點擊其右邊的小按鈕,在彈出的附加包含目錄中,確保條目 $(WindowsSdkDir)\include 和 $(FrameworkSDKDir)include 在任何dx目錄的前面。如下圖:
 

 

 

文章三

轉自:http://bbs.csdn.net/topics/390638330

一,問題描述
    本人最開始用的是vs2005,后來由於做手機開發,又安裝了vs2008,這時候,項目中的某些文件出現編譯錯誤,后來經過研究,發現原因是:Platform SDK安裝到了vs2005的安裝目錄中,vs2008的項目包含路徑中沒有包含platfor SDK的include文件。沒說的,自己果斷加上,解決問題。
    后來,由於公司的要求,又要使用vs2010,所以,電腦上又安裝了vs2010,編譯項目,出現編譯錯誤:“不允許重載函數“_interlockedbittestandreset”的第二個 C 鏈 ”,經過網上搜索,發現原因是,由於安裝vs2010的時候,自動包含了vs2008中的項目包含目錄作為父繼承,所以把安裝在vs2005中的platform SDK繼承下來了。_interlockedbittestandreset函數的定義在platform SDK中的winNT.h和Windows SDK中的winNT.h都有定義。這樣,項目中用到的intrin.h文件在調用_interlockedbittestandreset函數的時候,就發生了兩個SDK的沖突。
二,解決辦法
1,vs2010的項目VC++的包含目錄中添加Windows SDK的Include目錄。(注意要放到最前的位置,否則可能會出錯誤:
1>c:\program files\microsoft sdks\windows\v7.0a\include\objidl.h(11280): error C2061: 語法錯誤: 標識符“__RPC__out_xcount_part”
1>c:\program files\microsoft sdks\windows\v7.0a\include\objidl.h(11281): error C2059: 語法錯誤:“)”
1>c:\program files\microsoft sdks\windows\v7.0a\include\objidl.h(11281): fatal error C1903: 無法從以前的錯誤中恢復;正在停止編譯)
2,打開目錄編輯,去掉舊的platform SDK包含目錄
1)打開目錄C:\Documents and Settings\Administrator\Local Settings\Application Data\Microsoft\MSBuild\v4.0中的Microsoft.Cpp.Win32.user.props文件
2)<IncludePath>$(IncludePath);$(DXSDK_DIR)Include;$(EMERGENT_PATH)include;$(PHYSXINSTALLPATH)sdks\Physics\include</IncludePath>里去掉舊的platfrom SDK的include目錄。
重新編譯,搞定!
三,總結
類似的這個錯誤:
1>c:\program files\microsoft sdks\windows\v7.0a\include\objidl.h(11280): error C2061: 語法錯誤: 標識符“__RPC__out_xcount_part”
1>c:\program files\microsoft sdks\windows\v7.0a\include\objidl.h(11281): error C2059: 語法錯誤:“)”
1>c:\program files\microsoft sdks\windows\v7.0a\include\objidl.h(11281): fatal error C1903: 無法從以前的錯誤中恢復;正在停止編譯
原因:
Windows SDK和其它庫(如DirectX等)出現沖突。
解決方法如下:
把WindowsSDK的包含目錄放在最前!
操作:在項目上單擊右鍵—》屬性—》配置屬性—》VC++目錄,修改“包含目錄”,把 $(WindowsSdkDir)include 放在最前。重新編譯,搞定!

 

文章四

轉自http://www.xuebuyuan.com/1671066.html

cocos2d-x 在IDE vs2010 出現error C2146: 語法錯誤: 缺少“;”(在標識符“PVOID64”的前面)編譯錯誤解決方案

cocos2d-x 較高版本用到的IDE平台 vs2010 , 安裝了vs2010旗艦版.

打開運行cocos2d-x-2.2.0中的HelloCpp項目,居然報錯:

error
C2146: c:\program files\microsoft sdks\windows\v7.0a\include\winnt.h  語法錯誤: 缺少“;”(在標識符“PVOID64”的前面)

error C4430:

c:\program files\microsoft sdks\windows\v7.0a\include\winnt.h  缺少類型說明符 - 假定為 int。注意: C++ 不支持默認 int 

這兩錯誤是系統配置的問題,網上查找
說是vs的include順序問題,也有人說既然是找不到PVOID64加個typedef就行了。

對於第二種方法當然是排除(系統文件可不能亂改)。

於是尋求第一種解決方案。

開始的坑人的排雷過程:依別人的做法:

在vs中,選擇
工具->選項->項目和解決方案->VC++
目錄,在 顯示以下內容的目錄 選擇 包含文件,確保條目 $(WindowsSdkDir)\include 和 $(FrameworkSDKDir)include 在任何dx目錄的前面。

我打開一看,我的媽啊
,編輯被否決了。(如果你幸運的話 就直接在這更改nclude順序)。

 

不讓改, 對於IDE不是很熟的我只能google起 visual c++ 2010  VC++目錄編輯功能已被否決. 那過程別提了

先是 

在vs的解決方案資源管理器中右鍵相應的項目,選擇屬性,在屬性窗口的
配置屬性 -> C/C++ -> 常規 中的 附加包含目錄


發現在這改 只能此項目本身, 無法全局改變。於是又找了全局更改的方法

對於某一項目, 點擊菜單:視圖-》屬性管理器, 彈出屬性管理器窗口,點擊項目展開如圖:

 

 

右擊Microsoft.Cpp.Win32.user 彈出屬性頁 如圖

 

 將原本的放在最后的 $(IncludePath) 這宏放到最前面, 將E:\Program Files\DXSDK\Include; 更改放在第二位置上。

確定后重新編譯,順利完成。

 

 

論壇

轉自:http://bbs.csdn.net/topics/380219133

1>c:\program files\microsoft sdks\windows\v6.0a\include\winnt.h(296) : error C2146: 語法錯誤 : 缺少“;”(在標識符“WCHAR”的前面)
1>c:\program files\microsoft sdks\windows\v6.0a\include\winnt.h(296) : error C4430: 缺少類型說明符 - 假定為 int。注意: C++ 不支持默認 int
1>c:\program files\microsoft sdks\windows\v6.0a\include\winnt.h(299) : error C2143: 語法錯誤 : 缺少“;”(在“*”的前面)
1>c:\program files\microsoft sdks\windows\v6.0a\include\winnt.h(299) : error C2040: “PWSTR”: “CONST”與“WCHAR *”的間接尋址級別不同
1>c:\program files\microsoft sdks\windows\v6.0a\include\winnt.h(299) : error C4430: 缺少類型說明符 - 假定為 int。注意: C++ 不支持默認 int
1>c:\program files\microsoft sdks\windows\v6.0a\include\winnt.h(301) : error C2143: 語法錯誤 : 缺少“;”(在“*”的前面)
1>c:\program files\microsoft sdks\windows\v6.0a\include\winnt.h(301) : error C2371: “WCHAR”: 重定義;不同的基類型
1>        c:\program files\microsoft sdks\windows\v6.0a\include\winnt.h(289) : 參見“WCHAR”的聲明
1>c:\program files\microsoft sdks\windows\v6.0a\include\winnt.h(301) : error C4430: 缺少類型說明符 - 假定為 int。注意: C++ 不支持默認 int
1>c:\program files\microsoft sdks\windows\v6.0a\include\winnt.h(301) : error C4430: 缺少類型說明符 - 假定為 int。注意: C++ 不支持默認 int
1>c:\program files\microsoft sdks\windows\v6.0a\include\winnt.h(302) : error C2143: 語法錯誤 : 缺少“;”(在“*”的前面)
1>c:\program files\microsoft sdks\windows\v6.0a\include\winnt.h(302) : error C4430: 缺少類型說明符 - 假定為 int。注意: C++ 不支持默認 int
1>c:\program files\microsoft sdks\windows\v6.0a\include\winnt.h(302) : error C2378: “PCWSTR”: 重定義;符號不能由 typedef 重載
1>        c:\program files\microsoft sdks\windows\v6.0a\include\winnt.h(301) : 參見“PCWSTR”的聲明
1>c:\program files\microsoft sdks\windows\v6.0a\include\winnt.h(302) : error C4430: 缺少類型說明符 - 假定為 int。注意: C++ 不支持默認 int
1>c:\program files\microsoft sdks\windows\v6.0a\include\winnt.h(303) : error C2143: 語法錯誤 : 缺少“;”(在“*”的前面)
1>c:\program files\microsoft sdks\windows\v6.0a\include\winnt.h(303) : error C2371: “WCHAR”: 重定義;不同的基類型
1>        c:\program files\microsoft sdks\windows\v6.0a\include\winnt.h(289) : 參見“WCHAR”的聲明

謝謝大家說的回答,問題已解決:
將VC項目->配置屬性->C/C++->預處理器->預處理器定義->
WIN32
_WINDOWS
_DEBUG
改為
_INTEL
WIN32
_DEBUG
_CONSOLE
_Windows
_CRT_SECURE_NO_DEPRECATE
_WINNT
就可在VC項目中編譯C源程序

 

參考文章

文章一:http://bbs.csdn.net/topics/340230893

文章二:http://blog.csdn.net/ljf551551/article/details/16112965

文章三:http://codego.net/436908/

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM