相关疑难解决方法(0)

什么是摆脱"警告C4267可能丢失数据"的最佳策略?

我将一些遗留代码从win32移植到win64.不是因为Win32对象的大小是为我们的需求太少,而是因为Win64的是现在比较标准,我们希望端口的所有我们的环境,以这种格式(和我们也使用一些第三方库提供的64位比32位更好的性能) .

我们最终得到了大量的;

警告C4267:'参数':从'size_t'转换为'...',可能会丢失数据

主要是由于代码如下:unsigned int size = v.size();哪里v是STL容器.

我知道为什么警告有意义,我知道它为什么发布以及如何解决.但是,在这个具体的例子中,我们从未经历过容器大小unsigned int过去超过最大值的情况....所以当代码移植到64位环境时,没有理由出现这个问题.

我们讨论了什么是最好的策略来压制那些嘈杂的警告(他们可能会隐藏我们将会遗漏的相关警告),但我们无法对适当的策略做出决定.

所以我在这里问这个问题,最佳推荐策略是什么?

1.使用 static_cast

用一个static_cast.做unsigned int size = static_cast<unsigned int>(v.size());.我并不"喜欢",因为我们放弃了64位容量来在容器中存储大量数据.但由于我们的代码从未达到32位限制,所以这似乎是一个安全的解决方案......

2.替换unsigned intsize_t

这肯定更难,因为unsigned int size上面示例中的对象可以被设置为其他函数,保存为类属性,然后删除单行警告可能最终导致数百个代码更改...

3.禁用警告

这很可能是一个非常糟糕的主意,因为在这种情况下uint8_t size = v.size()它也会禁用警告,这肯定会导致数据丢失....

4.定义"安全演员"*功能并使用它

像这样的东西:

template <typename From, typename To> To safe_cast( const From& value )
{
    //assert( value < std::numeric_limits<To>::max() && value > std::numeric_limits<To>::min() );
    // Edit 19/05: test above fails in some …
Run Code Online (Sandbox Code Playgroud)

c++ windows porting casting suppress-warnings

9
推荐指数
1
解决办法
2867
查看次数

标签 统计

c++ ×1

casting ×1

porting ×1

suppress-warnings ×1

windows ×1