Семь шагов переноса программы в 64-битную систему - Компиляция приложения

ОГЛАВЛЕНИЕ

5. Компиляция приложения

Далее изложены типичные проблемы, возникающие на этапе компиляции 64-битной конфигурации, разобраны проблемы, возникающие в сторонних библиотеках, рассказано, что в коде, относящемся к функциям WinAPI, компилятор не позволяет помещать указатель в тип LONG, и вам придется обновить ваш код и использовать тип LONG_PTG. И это далеко не все. К сожалению, есть так много проблем, и ошибки столь разнообразны, что все их нельзя описать в одной статье  даже книге. Вам придется самому изучать все ошибки, показываемые компилятором, и все отсутствовавшие ранее новые предупреждения, и в каждом конкретном случае выяснять, как надо исправить код.

Следующий список ссылок на ресурсы, посвященные разработке 64-битных приложений, может отчасти помочь вам: http://www.viva64.com/links/64-bit-development/. Список непрерывно дополняется, и автор будет рад, если читатели отправят ему ссылки на достойные внимания ресурсы.

Ниже описаны типы, представляющие интерес для разработчиков при переносе приложений. Эти типы показаны в таблице 3. Большинство ошибок перекомпиляции связано с использованием данных типов.

Тип

Размер типа на платформе x32 / x64

Примечание

int

32 / 32

Базовыйтип. В 64-битных системах остается 32-битным.

long

32 / 32

Базовыйтип. В 64-битных системах Windowsостается 32-битным. Помните, что в 64-битных системах Linuxэтот тип был увеличен до 64-битного. Не забывайте об этом, если разрабатываете код, который должен компилироваться для систем Windowsи Linux.

size_t

32 / 64

Базовыйбеззнаковыйтип. Размер типа выбирается так, чтобы в него можно было записать массив теоретически возможного максимального размера. Можно безопасно поместить указатель в тип size_t (исключая указатели на функции класса, являющиеся особым случаем).

ptrdiff_t

32 / 64

Знаковый тип, похожий на size_t. Результат выражения, в котором один указатель вычитается из другого (ptr1-ptr2), имеет тип ptrdiff_t.

Указатель

32 / 64

Размер указателя прямо зависит от размера платформы. Будьте внимательны при преобразовании указателей в другие типы.

__int64

64 / 64

Знаковый 64-битный тип.

DWORD

32 / 32

32-битныйбеззнаковыйтип. В WinDef.h определенкак:typedef unsigned(беззнаковый) long(длинный) DWORD;

DWORDLONG

64 / 64

64-битныйбеззнаковыйтип. В WinNT.h определенкак:typedef ULONGLONG DWORDLONG;

DWORD_PTR

32 / 64

Беззнаковый тип, в который можно поместить указатель. В BaseTsd.hопределен как: typedefULONG_PTRDWORD_PTR;

DWORD32

32 / 32

32-битныйбеззнаковыйтип. В BaseTsd.h определенкак:typedef unsigned int(целый) DWORD32;

DWORD64

64 / 64

64-битныйбеззнаковыйтип. В BaseTsd.h определенкак:typedef unsigned __int64 DWORD64;

HALF_PTR

16 / 32

Половинауказателя. В Basetsd.h определенкак:#ifdef _WIN64 typedef int HALF_PTR;#else typedef short HALF_PTR;#endif

INT_PTR

32 / 64

Знаковый тип, в который можно поместить указатель. В BaseTsd.h определенкак:#if defined(_WIN64) typedef __int64 INT_PTR; #else typedef int INT_PTR;#endif

LONG

32 / 32

Знаковыйтип, оставшийся 32-битным. Оттого теперь зачастую должен использоваться LONG_PTR. В WinNT.h определен как:typedef long LONG;

LONG_PTR

32 / 64

Знаковый тип, в который можно поместить указатель. В BaseTsd.h определенкак:#if defined(_WIN64) typedef __int64 LONG_PTR; #else typedef long LONG_PTR;#endif

LPARAM

32 / 64

Параметрдляотправкисообщений. В WinNT.h определенкак:typedef LONG_PTR LPARAM;

SIZE_T

32 / 64

Аналогтипа size_t. В BaseTsd.h определенкак:typedef ULONG_PTR SIZE_T;

SSIZE_T

32 / 64

Аналогтипа ptrdiff_t. В BaseTsd.h определенкак: typedef LONG_PTR SSIZE_T;

ULONG_PTR

32 / 64

Беззнаковый тип, в который можно поместить указатель. В BaseTsd.h определенкак:#if defined(_WIN64) typedef unsigned __int64 ULONG_PTR;#else typedef unsigned long ULONG_PTR;#endif

WORD

16 / 16

Беззнаковый 16-битныйтип. In WinDef.h определенкак: typedef unsigned short(короткий) WORD;

WPARAM

32 / 64

Параметрдляотправкисообщений. В WinDef.h определенкак: typedef UINT_PTR WPARAM;

Таблица 3. Типы, на которые надо обращать внимание при переносе 32-битных программ на 64-битные системы Windows.