2011-04-01 58 views
3

我想的typedef DWORD在一個平臺無關的方式,和我遇到以下編譯器錯誤:爲什麼MinGW的自動包括<windef.h>

...\mingw.org\mingw_gcc_4.5.0\bin\../lib/gcc/mingw32/4.5.0/../../ 
../../include/windef.h:229:23: error: 
'DWORD' has a previous declaration as 'typedef long unsigned int DWORD' 

我希望能夠依靠我的DWORD實現,而不是基礎編譯器知道它是什麼(使用typedefs,而不是宏)。

爲什麼當編譯應用程序時,mingw(gcc 4.5.0)會自動包含「windef.h」?

如何避免這種情況?

回答

4

我的MinGW似乎沒有自動拉入windef.h。我懷疑你的程序是否包含了一些間接引入它的頭文件。你能發佈一個顯示問題的簡短程序嗎?

請注意,我看到您使用的是否定義了_WINDEF_H以確定這些東西是否已被typedef處理過。當使用MinGW時,這可能會起作用,但實際的Windows SDK在包含windef.h時定義_WINDEF_ - 至少有一個特定版本。我認爲這是相當穩定的,但它肯定有可能在某個時候發生了變化。

這可能是最好的東西,如宏MAKEWORD關鍵檢測是否windef.h已包括 - MAKEWORD被記錄爲在windef.h定義一個宏,所以它應該是整個SDK版本穩定,無論是從微軟或不。

4

解決它,

它被包含在由WINDOWS.H,由升壓頭文件包括在內。

定義這些類型定義的我的頭文件只是尋找「_WINDEF_H」的存在 - 並且有一條規則,即它必須是最後包含的頭文件(爲了使得頭文件包含足夠的時間,從而否定需要我的typedef)。

+0

你能否提供關於**哪個boost頭文件**的信息?這是Boost最不受歡迎的行爲。帶有數千個宏符號的頭文件可能會與任何事物發生衝突。 – 2016-04-28 08:03:51