2011-11-17 94 views
7

由於某些原因,當我在程序中將變量定義爲「uint」而不是「unsigned int」時,它會出錯。這看起來很奇怪,因爲uint是typedef'd:使用typedef'd uint會導致錯誤,而「unsigned int」不會...?

typedef unsigned int uint; 

...所以我想我可以使用這兩個可以互換。更確切地說,我將一個返回「unsigned int」的函數的結果賦值給一個uint變量,然後使用該uint在一個向量resize調用中調用......在這一點上它的錯誤。也就是說,我的代碼看起來像這樣:

unsigned int getUInt() 
{ 
    return 3; 
} 

int main(void) { 
    vector<vector<float> > vectVect(100000); 
    for(uint i = 0; i < vectVect.size(); ++i) 
    { 
     vector<float>& myVect = vectVect[i]; 
     uint myUnsignedInt = getUInt(); 
     myVect.resize(myUnsignedInt); 
    } 
    cout << "finished" << endl; 
} 

...而它錯誤的行是myVect.resize行。

顯然,我已經有了一個解決方案,但我想知道爲什麼會發生這種情況,因爲我很困惑。有人有主意嗎?

PS - 如果有人認爲它可能很重要,我在Fedora 15上使用gcc v4.1.2 ...並且定義uint的包含文件是/usr/include/sys/types.h。

+9

無論何時出現錯誤,您總是需要在問題中包含有問題的錯誤。 –

+1

你應該顯示失敗的真實代碼。特別是'#include'-s,'using'聲明等。而GCC 4.6可能比4.1更符合標準。 –

+0

[正如你在這裏看到的](http://ideone.com/Y1DRP),在你提供的例子中(至少在那個版本的gcc中),這個錯誤不會發生。 –

回答

6

我的猜測是,有系統中的另一個UINT。嘗試將你的名字重新命名爲不尋常的東西,甚至更好地將它包裝在命名空間中。

namespace MY { 
    typedef unsigned int uint; 
} 

for (MY::uint i = 0; .... 
+2

只會選擇這個答案,因爲這是一個很好的猜測,我從來沒有弄清楚到底發生了什麼...... –

-1

我的猜測是它試圖形成某種「層次結構」。

換句話說,我們有:

typedef unsigned int size_t; 
typedef unsigned int uint; 

如果size_t是比一般的unsigned int「更具體的」,則是有意義的防止它被轉換爲uint,這可能是「更具體的」比任何舊的unsigned int

我希望這是一個警告,如果有的話,雖然,不是一個錯誤......

+3

我不認爲就是這樣。 'typedef'爲類型創建別名,而不是新類型。因此,鑑於上述聲明,'unsigned int','size_t'和'uint'都是相同的類型(和'unsigned'和'int unsigned'一樣)。 –

+0

@KeithThompson:這就是*應該發生的事,我同意;我猜可能是編譯器意外地這樣做,而是idk。 – Mehrdad

相關問題