我最近不得不解决Delphi和c ++中用于枚举的不同默认大小,因为我必须使用delphi应用程序中的c ++ dll。
一个函数调用返回一个结构数组(或delphi中的记录),其第一个元素是枚举。
为了使这项工作,我使用打包记录(或对齐(1) - 结构)。但是,由于delphi默认情况下动态选择枚举变量的大小并使用尽可能小的数据类型(在我的情况下它是一个字节),但是C ++对枚举使用了int,我的数据没有被正确解释。
Delphi提供了一个编译器开关来解决这个问题,因此enum的声明变为
{$Z4}
TTypeofLight =
(
V3d_AMBIENT,
V3d_DIRECTIONAL,
V3d_POSITIONAL,
V3d_SPOT
);
{$Z1}
我的问题是:
答案 0 :(得分:3)
当 Delphi支持64位编译时,整数大小将保持4个字节,指针增加到8. FreePascal有PtrInt和PtrUInt类型,它们是“大到足以容纳指针的整数”和Delphi可能会添加类似的东西。
由于您明确声明了枚举大小,即使您在整数大小增加的平台上,它们仍将保持4个字节,因为通常它们只有1个字节。在布置解压缩的数据结构时,将应用现有规则,根据类型的大小对齐字段,因此整数将是4字节对齐,Int64和指针将是8字节对齐。
维基百科有table显示各种64位操作系统的数据类型大小,但现在推断Embarcadero将如何处理其他64位平台(Linux和OS X)还为时尚早。
答案 1 :(得分:2)
Delphi没有64位编译器,因此您无法为64位编译程序。但是,您仍然可以编译它并在64位操作系统上以32位进程运行它。在这种情况下,注意到你的结构会发生。
库的问题有点复杂:如果将其编译为64位库,则根本无法在32位进程中加载它。但是,假设您要将其编译为64位然后从64位进程使用它,那么int变量的实际长度很可能会保持32位(对于所有内容来说都不是这样,虽然)。
有关更多信息,请参阅此维基百科文章: