【问题标题】:Possible Lost of Data Converting from size_t to int从 size_t 转换为 int 可能会丢失数据
【发布时间】:2021-05-03 23:59:47
【问题描述】:

Windows 编程。按照MS page 的教程进行操作,然后到达底部的这一行:

TextOutW(hdc, 5, 5, greeting, wcslen(greeting));

变量greeting 是一个TCHAR 数组。 VS2019 在上一行报告了一个警告(C4267),从 wcslen() 返回的 和 TextOutW() 预期的 int 转换的最终参数中可能会丢失数据。我知道原始示例使用 _tcslen 宏而不是 wcslen() - 没关系。我理解为什么会发生这种情况,但对如何修改代码以解决警告感到完全困惑。

我找不到另一个可能需要 的 TextOutx()。

顺便说一句,当我在寻找答案时,我在某处读到 strlen() 在 64 位编程中已被弃用,尽管我不记得在哪里,我可能错了。

有解决办法吗?有什么建议吗?

【问题讨论】:

  • 除非你有数十亿个字符的字符串,否则这只是一个警告。您可以尝试通过强制转换来抑制它。
  • strlen() 只能处理长度约为 21 亿个字符的字符串,如果您的 size_t 如此有限的话。在通常具有 4GB 内存限制的 32 位架构上,这并不是真正的问题。看起来像 strlen() returns size_t 应该根据架构调整大小,不像 int,所以这里没有问题因为长度限制而被弃用,但 strnlen_s 更安全
  • 值得注意的是,从性能角度来看,在 >1GB 的字符串上调用 strlen() 将会非常痛苦。
  • @tad 您已经确定了不是的问题。这是一个 64 位构建,其中 wcslen 返回一个 64 位宽的 size_t。完全没有问题。它将该值传递给TextOutW,在此发生截断为int
  • @IInspectable 我试图解释为什么有人可能听说 strlen() 被“弃用”。

标签: c++ windows type-conversion desktop-application


【解决方案1】:

(int)wcslen(greeting); 的显式强制转换可以解决警告,但隐藏了潜在的数据丢失。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-27
    • 2018-01-26
    • 1970-01-01
    相关资源
    最近更新 更多