c++ - 关于 64 位环境中 Delphi 和 C++ 中的枚举

标签 c++ delphi 64-bit portability enumeration

我最近不得不解决 Delphi 和 C++ 中用于枚举的不同默认大小,因为我必须使用来自 Delphi 应用程序的 C++ DLL。

一个函数调用返回一个结构数组(或 delphi 中的记录),其第一个元素是一个枚举。

为了完成这项工作,我使用了压缩记录(或对齐的 (1) 结构)。然而,由于 Delphi 默认情况下动态选择枚举变量的大小并使用可能的最小数据类型(在我的例子中是一个字节),但 C++ 使用 int 枚举,我的数据没有被正确解释。

Delphi 提供了一个编译器开关来解决这个问题,所以枚举的声明变成了

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

我的问题是:

  • 在 64 位环境上/为 64 位环境编译时我的结构会变成什么?
  • 默认的 C++ 整数是否增长到 8 字节?
  • 是否有其他内存对齐/数据类型大小修改(指针除外)?

最佳答案

Delphi 支持 64 位编译时,整数大小将保持 4 字节,指针增加到 8。FreePascal 有 PtrInt 和 PtrUInt 类型,它们“整数足以容纳指针”和 Delphi大概会添加类似的东西。

由于您明确声明了枚举大小,因此即使您在整数大小增加的平台上,它们也将保持 4 字节,因为通常它们只会是 1 字节。在布置未打包的数据结构时,将应用现有规则,字段根据类型的大小对齐,因此整数将按 4 字节对齐,而 Int64 和指针将按 8 字节对齐。

维基百科有一个 table显示了各种 64 位操作系统的数据类型大小,但现在推断 Embarcadero 将如何处理其他 64 位平台(Linux 和 OS X)还为时过早。

关于c++ - 关于 64 位环境中 Delphi 和 C++ 中的枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2598535/

相关文章:

c++ - Valgrind 未检测到全局指针中的泄漏

multithreading - 如何在 Delphi 中编程线程数

delphi - 重构 "with" block 的工具

c++ - Linphone 编译 - Mingw 64 位 - 未找到 GNU gettext 工具;国际工具所需

c++ - 堆数组中对象的构造函数

c++ - 为什么我的删除功能总是出现段错误

c++ - 无法编译 64 位 Visual Studio 2010 项目

c# - WindowFromPoint 在 64 位 .NET Framework 上无法正常工作

c++ - 使用 MSG_DONTWAIT 的 C UDP 接收套接字总是失败

delphi - 如何在delphi中查看操作系统版本? Windows 7 还是 Server 2008 R2?