我刚刚接到了将旧应用程序从 32 位更新到 64 位的任务。在查看任务的范围时,我在包含外部(例如平台) header 之前立即发现了以下定义:

#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;

关于c++ - POINTER_32 - 它是什么,为什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3447812/

10-11 22:42
查看更多