2011-12-02 31 views
4

我使用開源代碼來構建我的項目。當我添加EGOTextView到項目中,它具有像語義問題:使用Xcode警告不同符號的整數比較


Comparison of integers of different signs: 'int' and 'NSUInteger' (aka 'unsigned long') 
Comparison of integers of different signs: 'NSInteger' (aka 'long') and 'NSUInteger' (aka 'unsigned long') 

例如,在源代碼:


    for (int i = 0; i < lines.count; i++)//lines is an array 

我注意到,該項目已建立配置文件,其中包括:

 
// Make CG and NS geometry types be the same. Mostly doesn't matter on iPhone, but this also makes NSInteger types be defined based on 'long' consistently, which avoids conflicting warnings from clang + llvm 2.7 about printf format checking 

OTHER_CFLAGS = $(value) -DNS_BUILD_32_LIKE_64 

根據評論,我想這會導致問題。 但是,我不知道這個OTHER_CFLAGS設置的含義。而且我也不知道如何解決它,以避免語義問題。

任何人都可以幫助我嗎?

謝謝!

回答

4

您正在查看的配置選項不會對您引用的警告執行任何操作。你需要做的是進入你的構建設置並搜索「符號比較」警告。把它關掉。

enter image description here

+0

謝謝,它的作品! – scorpiozj

+5

而不是關閉警告,如何修復錯誤?請參閱下面的[我的回答](http://stackoverflow.com/a/20543204/172218)。 –

+0

如果生成警告的文件來自外部庫,請改用文件上的-w'標誌。它會使文件中的警告無效,但不會影響項目的其餘部分。 –

3

,而不是把你的警告,也可以防止他們發生的。

您的lines.count屬於NSUInteger類型。讓這首一個int,然後做比較:

int count = lines.count; 
for (int i = 0; i < count; i++) 
+0

這只是掩蓋了編譯器警告OP的錯誤,並沒有解決它。請參閱[我的答案](http://stackoverflow.com/a/20543204/172218)以獲取解釋原因。 –

18

其實,我不認爲關閉編譯器警告是正確的解決方案,因爲比較的intunsigned long介紹個微妙的問題。

例如:

unsigned int a = UINT_MAX; // 0xFFFFFFFFU == 4,294,967,295 
signed int b = a; // 0xFFFFFFFF == -1 

for (int i = 0; i < b; ++i) 
{ 
    // the loop will have zero iterations because i < b is always false! 
} 

基本上,如果你簡單地拋棄(或明或暗地)的unsigned intint您的代碼將出現錯誤的行爲,如果你的unsigned int的值大於INT_MAX更大。

正確的解決辦法是投signed intunsigned int並且也比較signed int爲零,覆蓋的情況下爲負:

unsigned int a = UINT_MAX; // 0xFFFFFFFFU == 4,294,967,295 

for (int i = 0; i < 0 || (unsigned)i < a; ++i) 
{ 
    // The loop will have UINT_MAX iterations 
} 
5

而不是做這一切奇怪的類型轉換的各地地方,你應該首先注意到爲什麼你比較不同類型的第一個地方:你正在創造一個INT!

做到這一點,而不是:

for (unsigned long i = 0; i < lines.count; i++)//lines is an array 

...現在你是比較同類型!

+0

在這個答案中提出了類似這樣的建議:http://stackoverflow.com/a/12400226/27678 OP很可能使用int i來表示某事,所以我們不確定是否是個好主意只是完全改變它的類型。他們很有可能;我們只是不知道。 – AndyG

+0

@AndyG這不是上面建議的。 [link](stackoverflow.com/a/12400226/27678)使用隱式類型轉換(比最初展開的顯式動態類型轉換更糟糕,它具有運行時檢查功能,並且清除了讀取並在跳過代碼時突出顯示)來更改類型。很顯然,OP僅僅是從原始問題迭代一個數組:unsigned i是合適的。 –

相關問題