編程經驗:一個由<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. 問題原因
#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. 問題解決
4.總結
文章二
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
文章三
轉自: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/