2010-04-16 36 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