我正在更新一些旧代码,我在Visual Studio中遇到了warning C4244: '+=': conversion from 'std::streamsize' to 'unsigned long', possible loss of data
的数百条警告。
项目在忽略警告时编译并运行正常,但我想删除它们并在每个项目周围放置一个static_cast<unsigned long>()
函数。考虑到代码现在运行良好,这可能有害吗?
答案 0 :(得分:3)
是的,static_cast
可能会受到伤害,因为它会告诉编译器关闭,因为你知道你在做什么。问题是你是否真的知道你在做什么?
显然,如果存储的数据超过较小的类型大小,则转换为较小的类型会导致意外的结果。如果您确切知道,请使用static_cast
,这种情况不会发生,或者您希望截断值。如果没有,请保持警告,直到您正确设计代码为止。
答案 1 :(得分:2)
当忽略警告
时,项目编译并运行正常
首先,永远不要忽略警告。想一想你的代码实际上做了什么。
考虑到代码现在运行良好,这可能有害吗?
对于您的具体情况,来自static_cast<unsigned long>
的{{1}}会有害。
正如std::streamsize
的参考文档所述,它故意为std::streamsize
类型:
类型
signed
是签名整数类型,用于表示在I / O操作中传输的字符数或I / O缓冲区的大小。它用作std::streamsize
的签名对应项,类似于POSIX类型std::size_t
。
在这种情况下静态转换实际上意味着语义的丢失。
答案 2 :(得分:0)
这个想法是static_cast允许的转换次数要少一些 可能导致错误而不是需要reinterpret_cast的错误。在 原则上,可以不使用static_cast的结果 将它转换回原来的类型,而你应该总是施放 之前reinterpret_cast回到原始类型的结果 使用它来确保可移植性。
来自Bjarne Stroustrup's C++ Style and Technique FAQ
小心const
s。 static_cast
不会抛弃const
。
总的来说,我认为最好重写代码而不是“抛弃每一个问题”,希望一切顺利。