2010-08-10 106 views
4

我刚刚被赋予了将遗留应用程序从32位更新到64位的任务。在审查任务的程度,我发现下面的定义立即列入外部(如平台)头前:POINTER_32 - 它是什么,为什么?

#define POINTER_32 

我找不到什么用这个定义还是什么影响它,但它看起来像那种与我的任务直接相关的东西!

这是干什么用的?什么使用它?是否可以立即将其删除(我认为从长远来看,有必要将其删除)?

这是使用MS VC++ 2008年,很快就被2010年

回答

5

这是一个通常在Windows SDK头BaseTsd.h头文件中声明的宏。在32位模式下编译时,按照您的显示进行定义。当在64位模式下进行编译它被定义为

#define POINTER_32 __ptr32 

其是MSVC编译器扩展的64位代码模型声明32位指针。还有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左右。在32位和64位模型中提供32位指针

+0

这只是邪恶的:海湾合作委员会使这个警告错误供参考,它应该是。但那只是我的两分钱。 C++提供'(u)intptr_t'和'ptr_diff'来存储整型类型的指针。 – rubenvb 2010-08-10 12:51:16

+0

对于任何人在这个答案绊脚石... POINTER_32不提供一个32位指针。它提供了一个截断的64位指针。 – EKW 2015-07-10 14:18:33

相关问题