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


Перевод 32 в 64


Итак, я рассказал обо всех программных средствах, предоставляемых Win64. Пора разобраться, как применить эти знания. В общем виде алгоритм перевода кода Win32 на 64-разрядную платформу выглядит так:

  • замена "старых" типов новыми в тех случаях, когда это необходимо;
  • замена всех 32-разрядных указателей на 64-разрядные;
  • замена всех API-функций Win32 их 64-разрядными эквивалентами.

Для создания кросс-платформенных приложений (это предпочтительней первого варианта) необходимо:

  • воспользоваться макросами, определяющими платформу;
  • заменить все 32-разрядные типы данных их интегральными эквивалентами; <>li>заменить все указатели на 64-разрядные;
  • заменить API-функции Win32 их интегральными эквивалентами.

К сожалению, пока не существует программ, которые могли бы помочь это сделать. Поэтому все изменения нужно делать самим. Единственным помощником в данном случае является 64-разрядный компилятор: в частности, его режим предупреждений (warnings), касающийся 64-разрядного кода. Для того чтобы включить эти предупреждения, нужно воспользоваться параметром компилятора-Wp64-W3. Он сделает активными следующие предупреждения:

  • C4305 - предупреждение о преобразовании типов. Например, "return": truncation from "unsigned int64" to "long";
  • C4311 - предупреждение о преобразовании типов. Например, "type cast": pointer truncation from "int*_ptr64" to "int";
  • C4312 - преобразование до большего размера (bigger-size). Например, "type cast": conversion from "int" to "int*_ptr64" of greater size;
  • C4318 - использование нулевой длины (Passing zero length). Например, passing constant zero as the length to the memset function;
  • C4319 - нет оператора (Not operator). Например, "~": zero extending "unsigned long" to "unsigned _int64" of greater size;
  • C4313 - вызов функций, входящих в printf-семейство, с конфликтным преобразованием типов в спецификаторах и аргументах. Например, "printf": "%p" in format string conflicts with argument 2 of type "_int64." Или, например, вызов функции printf("%x", pointer_value) потребует преобразования верхних 32 разрядов. Правильный вызов: printf("%p", pointer_value);
  • C4244 - то же, что и C4242. Например, "return": conversion from "_int64" to "unsigned int," possible loss of data.

Для преобразования кода в 64-разрядный нужно исправить все строки кода, на которые укажет компилятор. Некоторые советы приведены в таблице ниже.


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



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