2010-04-08 2 views
0

Мне недавно пришлось работать с различными размерами по умолчанию, используемыми для перечислений в Delphi и C++, так как я должен использовать dll C++ из приложения delphi.О перечислениях в Delphi и C++ в 64-разрядных средах

Один вызов функции возвращает массив структур (или записей в delphi), первым элементом которого является перечисление.

Для выполнения этой работы я использую упакованные записи (или выровненные (1) -структуры). Однако, поскольку delphi динамически выбирает размер переменной enum по умолчанию и использует наименьший тип данных (он был байтом в моем случае), но C++ использует int для перечислений, мои данные не были правильно интерпретированы.

Delphi предлагает переключатель компилятора, чтобы обойти это, поэтому декларация перечисления становится

{$Z4} 
    TTypeofLight = 
    (
     V3d_AMBIENT, 
     V3d_DIRECTIONAL, 
     V3d_POSITIONAL, 
     V3d_SPOT 
    ); 
    {$Z1} 

Мои вопросы:

  • Что будет с моими структурами, когда они составлены на/для 64-битной среды?
  • Увеличивает ли значение по умолчанию целое число C++ до 8 байтов?
  • Существуют ли другие модификации размера/размера данных (кроме указателей)?

ответ

2

Для Delphi нет компилятора 64 бит, поэтому вы не можете скомпилировать свою программу для 64 бит. Однако вы все равно можете скомпилировать его и запустить на 64-битной ОС в виде 32-битного процесса. в этом случае заметьте, что произойдет с вашими структурами.

Вопрос об библиотеке немного сложнее: если вы скомпилируете его как 64-битную библиотеку, вы не сможете загрузить ее в свой 32-битный процесс вообще. Однако, предполагая, что вы собираетесь скомпилировать его для 64 бит, а затем использовать его из 64-битного процесса, тогда фактическая длина переменной int, скорее всего, останется 32 бита (это не будет иметь место для всего, хоть).

Смотрите эту статью Википедии для более определенной информации:

http://en.wikipedia.org/wiki/64-bit#Specific_data_models

+0

Благодарим вас за ввод. +1 – sum1stolemyname

+0

(есть некоторые мэйнфреймы, которые являются ILP64, iow integer = 64-бит, но вы вряд ли столкнетесь с ними, используя простой Delphi) –

3

Когда Delphi поддерживает 64-битную компиляцию целочисленного размера останется 4 байта, с указателями увеличиваются до 8. FreePascal имеет PtrInt и Типы PtrUInt, которые являются «Целыми, достаточно большими для хранения указателей», и Delphi предположительно добавит что-то подобное.

Поскольку вы явно объявляете размеры перечисления, они останутся 4 байтами, даже если вы были на платформе, где размер целого возрастал, так как обычно они были бы только 1 байт. При размещении распакованных структур данных применяется существующее правило, которые выравниваются по размеру типа, поэтому целые числа будут выровнены по 4 байт, а Int64 и указатели будут выровнены по 8 байт.

В Википедии есть table, показывающий размеры типа данных для различных 64-разрядных ОС, но еще слишком рано экстраполировать, как Embarcadero будет обрабатывать другие 64-разрядные платформы (Linux и OS X).

+2

Delphi уже имеет IntPtr и UIntPtr для этих типов. –

+1

FPC, похоже, не поддерживает 8 байтовых перечислений (например, с использованием пакета $ packenum): Ошибка: Недопустимый спецификатор минимального размера перечисления «8». (Кстати: IntPtr был добавлен позднее в версии Delphi после добавления FPC PtrInt (2005 timeframe), следовательно, разница.) –