【问题标题】:Warning C4267 'initializing': conversion from 'size_t' to 'DWORD', possible loss of data警告 C4267“正在初始化”:从“size_t”转换为“DWORD”,可能丢失数据
【发布时间】:2019-09-16 16:16:14
【问题描述】:

编译我的 C++ 应用程序时收到以下警告消息,

警告 C4267 'initializing':从 'size_t' 转换为 'DWORD',可能会丢失数据 在下面一行:

DWORD nPos = strRegPath.find(REG_SOFTWARE); 

以下是我的完整代码:

声明:

#define REG_SOFTWARE L"Software"
wchar_t* m_wszParams;

定义:

wstring strRegPath = m_wszParams;

DWORD nPos = strRegPath.find(REG_SOFTWARE); 

谁能帮我解决这个警告?

提前致谢。

【问题讨论】:

  • DWORD 在 MSWindows 中是 32 位 unisgned 类型。 size_t 在任何 64 位操作系统中都是 64 位无符号的。因此将 64 位转换为 32 位可能会丢失数据。
  • 除非您的字符串长度超过 32 位无符号数(即 2GB),否则不会给您带来问题,但您为什么希望这是 DWORD
  • auto 可以使用真实类型。 (即使稍后,您也可能需要转换)。

标签: c++ c++11


【解决方案1】:

问题是由DWORD 在大小方面落后于std::size_t 引起的。如果写

std::size_t nPos = strRegPath.find(REG_SOFTWARE); 

只是把罐子踢到路上,也就是说你会在其他地方收到警告,然后你可以强制解决问题

static_cast<DWORD>(strRegPath.find(REG_SOFTWARE));

因此,您实际上是在告诉编译器您知道自己在做什么,这应该足以抑制警告,或者使用进行运行时检查的东西来验证您没有丢失数据:@987654326来自 Boost 的 @ 可以提供帮助:

https://www.boost.org/doc/libs/1_38_0/libs/numeric/conversion/doc/html/boost_numericconversion/improved_numeric_cast__.html

【讨论】:

  • 嗨@Bathsheba,不使用static_cast,我可以像下面这样投射它吗:
  • (DWORD)(strRegPath.find(REG_SOFTWARE));
  • @JohnPaulCoder:当然,你可以“C-style cast”它,但是static_cast 更清晰。
猜你喜欢
  • 2018-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-07
  • 1970-01-01
  • 2021-05-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多