2011-12-02 29 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是合适的。 –

相关问题