POINTER_32 - что это и почему? - PullRequest
4 голосов
/ 10 августа 2010

Мне только что дали задание обновить устаревшее приложение с 32-разрядного на 64-разрядное.Рассматривая масштаб задачи, я обнаружил следующее определение непосредственно перед включением внешних (например, платформы) заголовков:

#define POINTER_32

Я не могу найти, что использует это определение или какое влияние оно оказывает, нопохоже на то, что будет иметь непосредственное отношение к моей задаче!

Для чего это нужно?Что использует это?Будет ли безопасно удалить его немедленно (я полагаю, что это будет необходимо удалить в долгосрочной перспективе)?

Используется MS VC ++ 2008, скоро будет 2010.

Ответы [ 2 ]

6 голосов
/ 10 августа 2010

Это макрос, который обычно объявляется в заголовке Windows SDK, заголовочном файле BaseTsd.h.При компиляции в 32-битном режиме он определяется так, как вы показали.При компиляции в 64-битном режиме он определяется как

 #define POINTER_32 __ptr32

, который является расширением компилятора MSVC для объявления 32-битных указателей в модели 64-битного кода.Существует также 64-битный вариант для 32-битного кода:

 #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 голос
/ 10 августа 2010

Используется для обхода предупреждения C4244 . Предоставляет 32-разрядный указатель как в 32-разрядной, так и в 64-разрядной моделях

...