无法将参数 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_T
与 std::size_t
不同。第一个是 Windows 头文件中的 #define
d 类型,第二个是由 C++ 编译器定义的类型。它们是不同的类型。
至少在我的系统上,SIZE_T
是ULONG_PTR
的typedef
,这是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 *' -- 为啥?的主要内容,如果未能解决你的问题,请参考以下文章
在 C++ 中从 size_t 转换/转换为 uint8_t?
C4244:“+=”:从“std::streamsize”转换为“size_t”,可能丢失数据