使用Xcode警告不同符号的整数比较

sco*_*ozj 6 configuration xcode build

我使用开源来构建我的项目.当我添加EGOTextView到项目时,它有语义问题,如:


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')
Run Code Online (Sandbox Code Playgroud)

例如在源代码中:


     for (int i = 0; i < lines.count; i++)//lines is an array
Run Code Online (Sandbox Code Playgroud)

我注意到该项目已构建配置文件,其中包括:

// 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设置的含义.而且我也不知道如何修复它以避免语义问题.

任何人都可以帮助我吗?

谢谢!

j b*_*j b 24

实际上,我不认为关闭编译器警告是正确的解决方案,因为比较a int和an会unsigned long引入一个微妙的bug.

例如:

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!
}
Run Code Online (Sandbox Code Playgroud)

基本上,如果您只是(隐式或显式地)抛弃unsigned int一个int代码,如果您的值unsigned int大于INT_MAX,则代码将表现不正确.

正确的解决方案是将signed intto转换为unsigned intto并将其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
}
Run Code Online (Sandbox Code Playgroud)


小智 6

你应该首先注意为什么你首先要比较不同的类型,而不是做所有这种奇怪的类型铸造:你创造了一个INT!

改为:

    for (unsigned long i = 0; i < lines.count; i++)//lines is an array
Run Code Online (Sandbox Code Playgroud)

...现在你正在比较相同的类型!


SSt*_*eve 4

您正在查看的配置选项不会对您引用的警告执行任何操作。您需要做的是进入构建设置并搜索“符号比较”警告。把它关掉。

在此输入图像描述

  • 与其关闭警告,不如修复错误如何?请参阅下面的[我的答案](http://stackoverflow.com/a/20543204/172218)。 (7认同)