Delphi 2007 и XE2: использование NativeInt - PullRequest
14 голосов
/ 03 октября 2011

Начиная с Delphi XE2, NativeInt имеет новое значение.При 32-разрядной среде выполнения NativeInt представляет собой 32-разрядное целое число.При 64-разрядной среде выполнения NativeInt представляет собой 64-разрядное целое число.

У меня есть несколько исходных файлов, в которых используются сторонние библиотеки DLL (32- и 64-разрядные).Эти библиотеки DLL используют 32- и 64-разрядное целое число как на 32-разрядной, так и на 64-й платформах соответственно.

Эти исходные файлы работают в Delphi 2007 - 32-разрядная платформа Delphi XE2 без проблем:

например:

function Test: Integer;

Когда я пытаюсь перенести эти исходные файлы на 64-битную платформу Delphi XE2, вышеуказанная функция больше не работает, так как для нее требуется 64-битное целое число.Чтобы исходный код работал на обеих платформах 32/64, я изменяю на

function Test: NativeInt;

И он работает.

Однако объявление не работает в Delphi 2007 как Delphi 2007трактовать NativeInt как 64-битное целое число: SizeOf (NativeInt) = 8

Я могу решить эту проблему, используя условную директиву RtlVersion или CompilerVersion для

function Test: {$if CompilerVersion<=18.5}Integer{$else}NativeInt{$ifend};

Но это будет утомительно, поскольку существует множествообъявление в исходных файлах.

Есть ли более эффективные способы заставить исходные файлы работать в Delphi 2007-XE2 win32 и XE2 win64 platform?

Ответы [ 2 ]

21 голосов
/ 03 октября 2011

Лучшей альтернативой является переопределение самого типа NativeInt:

{$if CompilerVersion<=18.5}
type
  NativeInt = Integer;
{$ifend}

Это должно быть сделано один раз за единицу и может быть реализовано как часть общего файла * .inc.

0 голосов
/ 03 октября 2011

Ну и дела: почему бы просто не использовать LongInt (где вам нужно 32-битное) и Int64 (в противном случае)?

И просто использовать "целое число", где это не имеет значения?

Этокажется просто нелогичным использовать NativeInt там, где вы ЗНАЕТЕ, что это будет означать разные вещи в разное время ...

PS: вы всегда можете определить свой OWN, пользовательский тип и $ ifdef!

...