我的代码中有这样的表达式:
QByteArray idx0 = ...
unsigned short ushortIdx0;
if ( idx0.size() >= sizeof(ushortIdx0) ) {
// Do something
}
Run Code Online (Sandbox Code Playgroud)
但是我收到了警告:
警告:有符号和无符号整数表达式之间的比较[-Wsign-compare]
Run Code Online (Sandbox Code Playgroud)if ( idx0.size() >= sizeof(ushortIdx0) ) { ~~~~~~~~~~~~^~~~~~~~~~
为什么size()的QByteArray形式返回int,而不是unsigned int?我怎样才能安全地摆脱这个警告?
有些人认为,unsigned多年前将类型引入C是一个坏主意.这些类型发现自己被引入到C++中,它们深深地嵌入到C++标准库和操作符返回类型中.
是的,sizeof按标准必须返回一种unsigned类型.
在Qt开发人员采用现代思维的unsigned类型是一个糟糕的主意,和青睐而不是使的返回类型size一个signed类型.就个人而言,我发现它特殊.
要解决,你可以(i)接受警告,(ii)在功能期间关闭它,或者(iii)写下像
(std::size_t)idx0.size() >= sizeof(ushortIdx0)
Run Code Online (Sandbox Code Playgroud)
以清晰为代价.
为什么QByteArray的size()以int而不是unsigned int的形式返回?
我真的不知道为什么Qt选择签名回报size().但是,有充分的理由使用signed而不是unsigned.
一个臭名昭着的unsigned size()失败的例子是这个看起来很无辜的循环:
for (int i = 0; i < some_container.size() - 1; ++i) {
do_somehting(some_container[i] , some_container[i+1] );
}
Run Code Online (Sandbox Code Playgroud)
使循环体对两个元素进行操作并不常见,在这种情况下,它似乎只是迭代直到有效的选择some_container.size() - 1.
但是,如果容器为空,some_container.size() - 1则无声(无符号溢出已明确定义)将变为无符号类型的最大值.因此,不是避免越界访问,而是导致你可以获得的最大越界.
请注意,此问题有一些简单的修复方法,但如果size()确实返回了签名值,则首先不需要修复问题.
| 归档时间: |
|
| 查看次数: |
359 次 |
| 最近记录: |