2010-04-27 1 views
3

Win32를 지원하는 Windows API에는 some new integer types이 있습니다. 그들은 항상 지원되지 않았습니다. 예 : they aren't present in MSVC6.ifdef를 사용하여 Windows DWORD_PTR 유형이 지원되는지 감지하는 방법?

이러한 유형이 <windows.h>으로 지원되는지 감지하려면 어떻게하면 #if 조건을 작성할 수 있습니까?

(내 코드는 MSVC6을 포함하여 다양한 버전의 Microsoft Visual C++에서 컴파일해야하므로 최신 컴파일러에서 사용하지 않도록 #if과 함께 이러한 유형의 자체 정의를 제공해야합니다.)

은 (수색자를 들어, 유형의 전체 목록은 다음과 같습니다 DWORD_PTR는, INT_PTR는 LONG_PTR, UINT_PTR, ULONG_PTR)이

답변

5

매크로 MSC_VER 그래서 당신이 #if MSC_VER>=1200 && MSC_VER<1300을 사용할 수 있습니다 MSVC 6의 범위 [1200, 1300) 내에있는 값입니다 .

편집 : 앤더스 (Anders)가 말했듯이, 이것은 "is my compiler MSVC 6"이상의 테스트에는 유효하지 않습니다. 그러나, 당신은 또한 사용할 수 있습니다 DWORD_PTR 이후

#if defined(MAXULONG_PTR) 

그것은 basetsd.h에 대해 정의 된 최대 값을 가지며, 값 유형입니다.

+2

컴파일러가 VC6이기 때문에 이러한 유형이 정의되어 있지 않다는 것을 의미하지는 않습니다. 일반적으로 VC6을 다소 최신 플랫폼 SDK와 함께 사용합니다. – Anders

+0

Anders의 의견은 허용 된 대답이어야하며 플랫폼 SDK를 업데이트해야합니다. 오래된 버전의 코드를 작성하려고 시도하십시오. – Blindy

+0

"#ifdef MAXULONG_PTR"은 완벽합니다. 감사합니다. – user9876

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

+0

또는 MAXULONG_PTR. 그것없이 DWORD_PTR을 가지지 않기 때문에. – MSN