Средства разработки приложений


Азбука 64-разрядного программирования


Для работы с 64-разрядным кодом понадобятся компилятор, линкер и несколько подключаемых библиотек. Все это есть в последних дистрибутивах SDK и DDK. Прежде всего, необходимо рассмотреть макросы и директивы компилятора, предназначенные для 64-разрядного кода:

  • _WIN64 - 64-разрядная платформа;
  • _WIN32 - 32-разрядная платформа (для совместимости с 32-разрядной платформой);
  • _WIN16 - 16-разрядная платформа.

Также компилятор имеет встроенные предопределенные макросы, специфичные для различных архитектур процессоров:

  • _M_IA64 - 64-разрядная архитектура Intel;
  • _M_IX86 - 32-разрядная архитектура Intel;
  • _M_ALPHA_64 - 64-разрядная архитектура Alpha;
  • _M_ALPHA32 - 32-разрядная архитектура Alpha;
  • _M_ALPHA - архитектура Alpha, либо 32-разрядная, либо 64-разрядная.

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

Теперь есть возможность создавать приложения, работающие и на 32-, и на 64-разрядной платформах. Здесь есть, однако, немало подводных камней. Следует быть очень внимательным - например, следующий код был вполне пригоден для приложений, но не для 64-разрядной платформы: #ifdef _WIN32 // Win32 код ... #else // А здесь неясно, какой код следует далее: 64- или 16-разрядный... ... #endif И этот код не является корректным: #ifdef _WIN16 // Win16 код ... #else // То же самое: 32- или 64-разрядный код? ... #endif

Чтобы исправить этот код, нужно после #else добавить макросы _WIN32 или _WIN64. Просто придется привыкнуть к тому, что теперь код бывает трех (а не двух, как раньше) , поэтому использование директивы #else в привычных конструкциях приведет к неоднозначности (хотя 16-разрядных приложений становится все меньше и меньше, поддержка этой платформы в современных компиляторах остается).

Теперь рассмотрим новые типы данных. Их можно условно разделить на три группы (см. Таблицу 1):

  • целочисленные типы явного представления (fixed-precision integer types);
  • целочисленные типы, представленные указателями (pointer-precision integer types);
  • типы специальных указателей (specific-precision pointer types).

Описания этих типов находятся в файле basetsd.h (входящем в состав DDK/SDK) и приведены в Таблице 1.

Теперь рассмотрим особенности новых типов данных.


Начало  Назад  Вперед



Книжный магазин