2010-04-27 6 views
3

Il existe some new integer types dans l'API Windows pour prendre en charge Win64. Ils n'ont pas toujours été soutenus; par exemple. they aren't present in MSVC6. Comment puis-je écrire une condition #if pour détecter si ces types sont pris en charge par <windows.h>?Comment détecter si le type Windows DWORD_PTR est supporté, en utilisant un ifdef?

(Mon code doit compiler sous de nombreuses versions différentes de Microsoft Visual C++, y compris MSVC6. Je dois fournir mes propres définitions de ces types, avec un #if pour les désactiver dans les compilateurs les plus récents).

(Pour les chercheurs, la liste complète des types est: DWORD_PTR, INT_PTR, LONG_PTR, UINT_PTR, ULONG_PTR)

Répondre

5

La MSC_VER macro est une valeur qui est comprise dans la plage [1200, 1300) pour MSVC 6. Vous pouvez donc utiliser #if MSC_VER>=1200 && MSC_VER<1300 .

EDIT: Comme Anders l'a dit, ce n'est pas vraiment valable d'un test au-delà de "est mon compilateur MSVC 6". Cependant, vous pouvez également utiliser:

#if defined(MAXULONG_PTR) 

Depuis DWORD_PTR est un type de valeur, il a une valeur maximale définie pour en basetsd.h.

+2

Juste parce que le compilateur VC6 ne veut pas dire que ces types ne sont pas définis, habituellement vous utiliserez VC6 avec une plate-forme quelque peu à jour sdk – Anders

+0

Le commentaire d'Anders devrait être la réponse acceptée, mettre à jour votre plate-forme sdk, don ' Essayez de coder autour de versions obsolètes. – Blindy

+0

"#ifdef MAXULONG_PTR" est parfait, merci! – user9876

4

Étant donné que ces types sont des typedefs, il n'existe pas de moyen fiable et fiable de déterminer s'ils sont définis ou non au niveau du pré-processeur. La suggestion de MSN de tester la version du compilateur est assez bonne, mais comme Anders l'a indiqué dans un commentaire, un SDK plus récent pourrait être utilisé (je pense que VC6 a été supporté par le SDK 2003 - je ne suis pas sûr que ces types sont dans ce SDK ou non).

Vous pouvez vérifier quelque chose que le SDK ne définit comme une macro qui utilise ces types, comme GetWindowLongPtr:

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

kludgy, mais je pense que vous pourriez être coincé avec kludgy.

+0

J'allais suggérer #ifdef de vérifier la macro UintToPtr, il semble être défini dans ma plate-forme 2003 sdk, mais pas les anciens en-têtes vc6, mais GWLP est tellement plus cool. Je ne suis pas sûr si GWLP est une macro sur x64, alors peut-être qu'une vérification! _WIN64 est nécessaire, ou vous pouvez vérifier les définitions de GWLP_ * à la place. – Anders

+0

ou MAXULONG_PTR. Puisque vous n'aurez pas DWORD_PTR sans cela. – MSN

Questions connexes