2010-04-27 83 views
3

Windows API中有some new integer types支持Win64。他們並不總是得到支持;例如they aren't present in MSVC6如何使用ifdef檢測Windows DWORD_PTR類型是否受支持?

如何編寫#if條件來檢測<windows.h>是否支持這些類型? (我的代碼需要編譯許多不同版本的Microsoft Visual C++,包括MSVC6,因此我需要提供我自己的這些類型的定義,#if在較新的編譯器中禁用它們)。

(對於搜索,類型的完整列表是:DWORD_PTR,INT_PTR,LONG_PTR,UINT_PTR,ULONG_PTR)

回答

5

MSC_VER是一個值,它是MSVC 6的範圍內[1200, 1300)所以你可以使用#if MSC_VER>=1200 && MSC_VER<1300

編輯:正如安德斯所說,這是不是真正有效的測試超越「是我的編譯器MSVC 6」。但是,你也可以使用:

#if defined(MAXULONG_PTR) 

由於DWORD_PTR是值類型,它在basetsd.h爲它定義的最大值。

+2

只是因爲編譯器VC6並不意味着這些類型沒有定義,通常你會一起使用VC6帶着幾分最新的平臺SDK – Anders 2010-04-27 17:17:22

+0

Anders的評論應該是公認的答案,更新平臺SDK,不要」嘗試編寫過時版本的代碼。 – Blindy 2010-04-27 17:30:03

+0

「#ifdef MAXULONG_PTR」是完美的,謝謝! – user9876 2010-04-28 10:10:41

4

由於這些類型都是typedef,所以沒有一個好的,可靠的方法來確定它們是否在預處理器階段被定義。 MSN關於測試編譯器版本的建議很不錯,但正如Anders在評論中指出的那樣,可能會使用更近期的SDK(我認爲VC6通過2003 SDK得到了支持 - 我不確定這些類型是否在SDK或不)。

你可以檢查東西SDK並定義爲使用這些類型的,像GetWindowLongPtr宏:

#if !defined(GetWindowLongPtr) 
typedef DWORD DWORD_PTR; 
#endif 

缺憾,但我想你可能與缺憾被卡住。

+0

我打算建議#ifdef檢查UintToPtr宏,它似乎是在我的2003平臺sdk中定義的,但不是舊的vc6頭文件,但GWLP非常酷。我不確定GWLP是否是x64上的宏,因此可能需要!_WIN64檢查,或者您可以檢查GWLP_ *定義。 – Anders 2010-04-27 17:32:26

+0

或MAXULONG_PTR。由於沒有它,你將不會有DWORD_PTR。 – MSN 2010-04-27 18:04:05

相關問題