C4267:"返回":从"size_t"转换为"const UINT",可能会丢失数据

C4267: 'return' : conversion from 'size_t' to 'const UINT', possible loss of data

本文关键字:数据 UINT size 返回 C4267 转换 const      更新时间:2023-10-16

如何使用类型转换来解决以下警告以const UINT?

C4267:"返回":从"size_t"转换为"const UINT",可能会丢失数据

Class CManager
{
   std::vector<CString>    m_ncount;
   public:
    const UINT GetMCount( int nInst) const;
}

const UINT CManager::GetMCount( int nInst) const
{
     return m_ncount.size();//C4267
}

这是正确的吗?

const UINT CManager::GetMCount( int nInst) const
{
     return (const UINT)m_ncount.size();//C4267
}

>UINT(这不是标准的。 unsigned int实际上是标准的)至少是 16 位,这意味着它是实现可靠的。不保证它可以用作index或容器size。但是,根据定义,size_t大小与sizeof运算符的输出完全相同。保证在所有情况下都可以在所有平台上工作。

因此,解决方案是使用 size_t .任何其他解决方案都将忽略实际问题。感谢您的编译器警告!

如果需要在

向量中保存 INT_MAX 个以上的项目,请使用 size_t 。在大多数情况下,这并不重要,但我使用size_t只是为了删除警告。

试试这个

std::size_t CManager::GetMCount( int nInst) const
{
     return m_ncount.size();
}

如果您使用的是UINT那么您可能在 Windows 下编码。在 32 位应用程序中,sizeof(UINT)sizeof(size_t) 等于 4,但在 64 位构建下,这不是真的,sizeof(UINT)是 4,sizeof(size_t)是 8。

一种解决方案是使用 UINT_PTR ,无论您使用什么类型,都可以添加静态断言,例如:

static_assert(sizeof(UINT_PTR) == sizeof(size_t), "size_t must equal to ULONG_PTR");

如果未绑定到 Windows 平台及其特定类型的宏定义,请考虑返回 size_t