我刚刚被赋予了将遗留应用程序从32位更新到64位的任务。在审查任务的程度,我发现下面的定义立即列入外部(如平台)头前:POINTER_32 - 它是什么,为什么?
#define POINTER_32
我找不到什么用这个定义还是什么影响它,但它看起来像那种与我的任务直接相关的东西!
这是干什么用的?什么使用它?是否可以立即将其删除(我认为从长远来看,有必要将其删除)?
这是使用MS VC++ 2008年,很快就被2010年
我刚刚被赋予了将遗留应用程序从32位更新到64位的任务。在审查任务的程度,我发现下面的定义立即列入外部(如平台)头前:POINTER_32 - 它是什么,为什么?
#define POINTER_32
我找不到什么用这个定义还是什么影响它,但它看起来像那种与我的任务直接相关的东西!
这是干什么用的?什么使用它?是否可以立即将其删除(我认为从长远来看,有必要将其删除)?
这是使用MS VC++ 2008年,很快就被2010年
这是一个通常在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;
用于获取 Warning C4244左右。在32位和64位模型中提供32位指针
这只是邪恶的:海湾合作委员会使这个警告错误供参考,它应该是。但那只是我的两分钱。 C++提供'(u)intptr_t'和'ptr_diff'来存储整型类型的指针。 – rubenvb 2010-08-10 12:51:16
对于任何人在这个答案绊脚石... POINTER_32不提供一个32位指针。它提供了一个截断的64位指针。 – EKW 2015-07-10 14:18:33