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