【问题标题】:What type should I use to define buffer size in interface?我应该使用什么类型来定义接口中的缓冲区大小?
【发布时间】:2016-01-13 15:00:17
【问题描述】:

我的模块将用于 x86 和 x64 环境。我有一个包含具有以下签名的导出函数的头文件。

HRESULT GetObject(DWORD key, void* pValue, MY_SIZE_T  cbSize);

我应该为 MY_SIZE_T 类型使用什么类型。

  1. 使用std::size_t 来描述pValue 指向的对象的大小。但是 std::size_t 在 x86 和 x64 平台上有所不同。我不确定它在界面级别是否正常。

  2. 使用具有固定宽度的DWORD。但是在 x64 平台上 DWORD 可能不够大。虽然很少有超过 2^32 字节的结构。

【问题讨论】:

  • 考虑使用uint64_t,虽然在某些平台上可能没有定义
  • 您是否打算编译此代码一次并在两个平台上使用相同的二进制代码?我想在size_t 的大小成为问题之前,您会遇到大量其他问题。
  • @KerrekSB 不。我将在两个平台上编译代码,一个用于 x86,一个用于 x64。
  • @ChenOT:那就用std::size_t;它的范围取决于平台这一事实并不重要。你得到你的平台支持的任何东西。就像您使用 32 位的地址空间更少一样。不同的平台是不同的; “便携”并不意味着“相同”,它意味着“在不同平台上有意义”。您的 32 位模块根本不支持大型结构。
  • @KerrekSB 谢谢。接口级别的一切都变得不同,所以我要小心导出的类型。

标签: c++ interface


【解决方案1】:

这取决于cbSize 应该包含的内容。如果它实际上是pValue所指向的对象的大小,那么std::size_t绝对是正确的选择。

std::size_t 保证存在,并且保证足够大以容纳对象的大小。如果你有 64 位指针,它至少有 64 位,如果你有 32 位指针,那么它(可能)只有 32 位。

请注意,二进制兼容性在这里可能不是问题。如果您有 32 位系统并为此进行编译,则无论如何都无法将其与为 64 位系统编译的代码链接。第三个参数的大小不同应该没问题(如果是这样的话,指针无论如何都会有问题)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-21
    • 2018-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多