【发布时间】:2016-01-13 15:00:17
【问题描述】:
我的模块将用于 x86 和 x64 环境。我有一个包含具有以下签名的导出函数的头文件。
HRESULT GetObject(DWORD key, void* pValue, MY_SIZE_T cbSize);
我应该为 MY_SIZE_T 类型使用什么类型。
使用
std::size_t来描述pValue 指向的对象的大小。但是 std::size_t 在 x86 和 x64 平台上有所不同。我不确定它在界面级别是否正常。使用具有固定宽度的
DWORD。但是在 x64 平台上 DWORD 可能不够大。虽然很少有超过 2^32 字节的结构。
【问题讨论】:
-
考虑使用
uint64_t,虽然在某些平台上可能没有定义 -
您是否打算编译此代码一次并在两个平台上使用相同的二进制代码?我想在
size_t的大小成为问题之前,您会遇到大量其他问题。 -
@KerrekSB 不。我将在两个平台上编译代码,一个用于 x86,一个用于 x64。
-
@ChenOT:那就用
std::size_t;它的范围取决于平台这一事实并不重要。你得到你的平台支持的任何东西。就像您使用 32 位的地址空间更少一样。不同的平台是不同的; “便携”并不意味着“相同”,它意味着“在不同平台上有意义”。您的 32 位模块根本不支持大型结构。 -
@KerrekSB 谢谢。接口级别的一切都变得不同,所以我要小心导出的类型。