Семь шагов переноса программы в 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.