Как определить, поддерживается ли тип Windows DWORD_PTR, используя ifdef? - PullRequest
3 голосов
/ 27 апреля 2010

В Windows API есть несколько новых целочисленных типов для поддержки Win64. Их не всегда поддерживали; например их нет в MSVC6 .

Как мне написать условие #if, чтобы определить, поддерживаются ли эти типы <windows.h>?

(Мой код должен компилироваться под многими различными версиями Microsoft Visual C ++, включая MSVC6. Поэтому мне нужно предоставить свои собственные определения этих типов с #if для их отключения в новых компиляторах).

(Для поисковиков полный список типов: DWORD_PTR, INT_PTR, LONG_PTR, UINT_PTR, ULONG_PTR)

Ответы [ 2 ]

5 голосов
/ 27 апреля 2010

Макрос MSC_VER - это значение, которое находится в диапазоне [1200, 1300) для MSVC 6. Поэтому вы можете использовать #if MSC_VER>=1200 && MSC_VER<1300.

РЕДАКТИРОВАТЬ: Как сказал Андерс, это не совсем то, что тест вне "мой компилятор MSVC 6". Однако вы также можете использовать:

#if defined(MAXULONG_PTR)

Поскольку DWORD_PTR является типом значения, для него определено максимальное значение в basetsd.h.

4 голосов
/ 27 апреля 2010

Так как эти типы являются typedefs, нет хорошего и надежного способа определить, определены они или нет на этапе препроцессора. Предложение MSN о тестировании версии компилятора довольно хорошее, но, как указал Андерс в комментарии, может быть использован более поздний SDK (я думаю, что VC6 поддерживался в SDK 2003 - я не уверен, что эти типы в этом SDK или нет).

Вы можете проверить что-то, что SDK определит как макрос, который использует эти типы, например GetWindowLongPtr:

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

Клуджи, но я думаю, что ты, возможно, застрял с Клудги.

...