2010-08-10 11 views
4

레거시 응용 프로그램을 32 비트에서 64 비트로 업데이트하는 작업을 방금 받았습니다. 작업의 범위를 검토하는 동안, 나는 즉시 외부 (. 예를 들어, 플랫폼) 헤더를 포함하기 전에 다음과 같은 정의를 발견 : 나는 어떤 영향이있다이 정의 또는를 사용하여 찾을 수없는POINTER_32 - 무엇이며, 그 이유는 무엇입니까?

#define POINTER_32 

하지만처럼 보인다 내 일과 직접적인 관련이있는 일!

무엇입니까? 무엇을 사용합니까? 즉시 제거하는 것이 안전할까요 (장기적으로 제거 할 필요가 있다고 생각합니까?)

곧 2010 년

답변

5

이 매크로는 일반적으로 Windows SDK 헤더 인 BaseTsd.h 헤더 파일에서 선언되는 매크로입니다. 32 비트 모드로 컴파일 할 때 보여 주듯이 정의됩니다. 64- 비트 모드에서 컴파일하는 경우이를

64 비트 코드 모델 32 비트 포인터를 선언하는 MSVC 컴파일러 확장이다
#define POINTER_32 __ptr32 

로 정의된다. 32 비트 코드를 64 비트 맛도 있습니다 :

#define POINTER_64 __ptr64 

64 비트 프로그램을 작성하고 다른 프로세스에서 32 비트 코드에 의해 사용되는 구조와 상호 운용성 필요가 있다면 당신은 그것을 사용하십시오 . 예 :

typedef struct _SCSI_PASS_THROUGH_DIRECT32 { 
    USHORT Length; 
    UCHAR ScsiStatus; 
    UCHAR PathId; 
    UCHAR TargetId; 
    UCHAR Lun; 
    UCHAR CdbLength; 
    UCHAR SenseInfoLength; 
    UCHAR DataIn; 
    ULONG DataTransferLength; 
    ULONG TimeOutValue; 
    VOID * POINTER_32 DataBuffer;  // <== here 
    ULONG SenseInfoOffset; 
    UCHAR Cdb[16]; 
}SCSI_PASS_THROUGH_DIRECT32, *PSCSI_PASS_THROUGH_DIRECT32; 
1

Warning C4244를 해결하기 위해 사용하는, MS VC++ 2008를 사용하고 있습니다. 32 비트 및 64 비트 모델 모두에서 32 비트 포인터를 제공합니다.

+0

GCC는 경고 FYI 오류를 경고합니다. 그러나 그것은 단지 나의 두 센트입니다. C++은 포인터를 정수형으로 저장하기 위해'(u) intptr_t'와'ptr_diff'를 제공합니다. – rubenvb

+0

이 대답에 걸림돌이되는 사람들을 위해 ... POINTER_32는 32 비트 포인터를 제공하지 않습니다. 잘린 64 비트 포인터를 제공합니다. – EKW

관련 문제