POINTER_32 - 它是什么,为什么?

And*_*ick 4 c++ 32bit-64bit visual-c++

我刚刚被赋予了将遗留应用程序从32位更新到64位的任务.在查看任务的范围时,我在包含外部(例如平台)标头之前立即发现了以下定义:

#define POINTER_32
Run Code Online (Sandbox Code Playgroud)

我找不到使用这个定义或它有什么效果的东西,但它看起来像是与我的任务直接相关的东西!

它是为了什么?有什么用?立即将其移除是否安全(我认为从长远来看有必要将其移除)?

这是使用MS VC++ 2008,很快将是2010年.

Han*_*ant 6

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

 #define POINTER_32 __ptr32
Run Code Online (Sandbox Code Playgroud)

这是一个MSVC编译器扩展,用于在64位代码模型中声明32位指针.对于32位代码,还有一个64位的味道:

 #define POINTER_64 __ptr64
Run Code Online (Sandbox Code Playgroud)

如果您编写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;
Run Code Online (Sandbox Code Playgroud)