編程經驗:一個由<Windows.h>引起的bug~

來源:互聯網
上載者:User

標籤:經驗   編程   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~

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.