这个C版本可以避免签名/未签名的比较吗?

sha*_*oth 3 c++ stl casting visual-c++

我正在审查一个C++项目并有效地看到以下内容:

std::vector<SomeType> objects;

//then later
int size = (int)objects.size();
for( int i = 0; i < size; ++i ) {
    process( objects[i] );
}
Run Code Online (Sandbox Code Playgroud)

这就是我所看到的.std::vector::size()返回size_t的大小可能与某个大小无关int.即使sizeof(int) == sizeof(size_t) int签名也无法容纳所有可能的值size_t.所以上面的代码只能处理一个很长的向量的下半部分并包含一个bug.正确的方法是使用size_t了两个size变量和循环索引.

那说我很好奇作者为什么写这个?

我唯一的猜测是,首先他省略了强制转换(int),编译器发出类似Visual C++ C4018的警告:

warning C4018: '<' : signed/unsigned mismatch
Run Code Online (Sandbox Code Playgroud)

所以作者虽然避免编译器警告的最好方法是简单地将其size_t转换int为使编译器闭嘴.

那个C演员还有其他可能的理智吗?

小智 9

我会说在C和C++中压倒性地使用C类强制转换只是为了让编译器闭嘴,很少或根本没有努力去理解它告诉你的内容.悲伤,但是真的.


Vir*_*gil 9

不,这可能就是原因.此外,矢量可能永远不会太长以至于存在截断大小的风险(app.开发人员会知道这一点).

并且...也许在程序的某些部分,他实际上将"大小"与其他类型的int进行比较,因此将大小设置为"size_t"类型会将其固定在一个地方,但在其他地方将其分解.