2010-04-16 61 views
3

我回顾一个C++项目,看看有效以下内容:为了避免签名/未签名的比较,此C是否有意义?

std::vector<SomeType> objects; 

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

这是我看到的。 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 

因此笔者虽然,为了避免编译器警告的最佳方式是简单地将size_t转换为int,从而使编译器闭嘴。

C剧情有没有其他可能的理智原因?

+1

Nitpick:'size()'返回实现定义的'vector :: size_type',不是必需的rily'size_t'。 – 2010-04-16 13:11:25

+0

nitpick的Nitpick:默认分配器确实使用'size_t'作为'size_type'。是的,你可以写'vector :: size_type s = v.size();',但是当你改变'v'的分配器时,你仍然会使用错误的'size_type',并且需要找到并更改用法(但是,typedefs可以帮助)。 – UncleBens 2010-04-16 14:12:42

+1

只要你输入你的矢量类型,使用YourVectorTypedef :: size_type应该总是给出正确的类型。 – 2010-04-16 14:40:24

回答

9

不,这可能是原因。再加上这个向量可能永远不会太长,以至于会缩小规模(应用程序开发人员会知道这一点)。

And ...也许在程序的某些部分,他实际上将“尺寸”与其他类型为int的其他类型进行了比较,因此将尺寸设置为“size_t”类型可以将其固定在一个位置,但将它放在其他位置。

9

我会说在C和C++中强制使用C casts只是为了让编译器闭嘴,很少或根本没有努力去理解它告诉你什么。伤心,但是真的。

+0

很多错误都是微不足道的,在上下文中毫无意义,或者无法读取。有意义的是,很多人的反应将会'闭嘴'。 – Jay 2010-04-16 17:46:58

+0

@Jay这是不正确的。大多数错误都是有意义的,应用投射几乎总是处理它们的错误方式。我自己的座右铭是 - “如果它需要演员,那就错了”。 – 2010-04-16 18:03:13

-4
unsigned int size = (int)objects.size(); 
for(unsigned int i = 0; i < size; ++i) { 
    process(objects[i]); 
} 
+0

什么?为什么不直接使用'size_t'?为什么仍然投到'int'? – 2010-04-16 12:05:25

+0

什么?这更糟糕。 size变量的期望类型是size_t,unsigned int的含义是什么? – unwind 2010-04-16 12:05:56

+0

size_t可能比unsigned int更大 – sharptooth 2010-04-16 12:06:09

4

显而易见的答案是使用:

size_t size = objects.size(); 
for(size_t i = 0; i < size; ++i) { 
    process(objects[i]); 
} 

或者是迂腐正确:

typedef std::vector<SomeType>::size_type s_t; 
s_t size = objects.size(); 
for (s_t i=0; i<size; ++i) 
    process(objects[i]); 

OTOH,除非你确定你需要自己编写循环,你通常使用算法更好:

std::foreach(objects.begin(), objects.end(), process); 
+0

在第一个版本中,您再次转换为int。 – sharptooth 2010-04-16 15:16:04

+0

@Sharptooth:糟糕 - 我复制了他的代码,并打算修复它,但错过了。感谢您指出。 – 2010-04-16 15:19:45