无法将参数 5 从 'SIZE_T *' 转换为 'size_t *' -- 为啥?

Posted

技术标签:

【中文标题】无法将参数 5 从 \'SIZE_T *\' 转换为 \'size_t *\' -- 为啥?【英文标题】:cannot convert parameter 5 from 'SIZE_T *' to 'size_t *' -- why?无法将参数 5 从 'SIZE_T *' 转换为 'size_t *' -- 为什么? 【发布时间】:2011-03-07 02:30:54 【问题描述】:

编译 32 位时出现此错误。相同的文件在 64 位 Windows 上编译时没有错误

1>c:\project\test.cpp(1317) : 错误 C2664: 'StringCbCopyExW' : 无法将参数 5 从 'SIZE_T *' 转换为 'size_t *'

SIZE_T 和 size_t 的大小和符号相同,那么有什么区别?为什么我在这里需要演员表?如果类型不同,为什么这只是在 32 位 Windows 上的错误?

【问题讨论】:

你能在 32 位 Windows 上为 size_t 和 SIZE_T 做 sizeof 吗? 【参考方案1】:

SIZE_Tstd::size_t 不同。第一个是 Windows 头文件中的 #defined 类型,第二个是由 C++ 编译器定义的类型。它们是不同的类型。

至少在我的系统上,SIZE_TULONG_PTRtypedef,这是unsigned long#define

【讨论】:

对于 64 位它是 typedef unsigned __int64 ULONG_PTR, *PULONG_PTR; 对于 32 位它是 typedef _W64 unsigned long ULONG_PTR, *PULONG_PTR;。在任何一种情况下,这些都应该是相同整数类型的别名。【参考方案2】:

SIZE_T 定义为什么?

它可能被定义为“unsigned int”,或者为向后兼容而定义为 uint32_t

【讨论】:

typedef ULONG_PTR SIZE_T, *PSIZE_T;

以上是关于无法将参数 5 从 'SIZE_T *' 转换为 'size_t *' -- 为啥?的主要内容,如果未能解决你的问题,请参考以下文章

将字符串转换为 size_t

在 C++ 中从 size_t 转换/转换为 uint8_t?

C4244:“+=”:从“std::streamsize”转换为“size_t”,可能丢失数据

将 size_t 转换为向量<unsigned char>

参数 5:无法从 'System.Drawing.Image' 转换为 'string' - 从主类调用 class1

将 opengl Window 转换为 std::size_t 并再次在 Linux 中有效,但在 OS X 中无效