我使用开源来构建我的项目。当我向项目添加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')
例如,在源代码中:
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
设置的含义。我也不知道如何修复它以避免语义问题。
有人可以帮助我吗?
谢谢!
答案 0 :(得分:23)
实际上,我不认为关闭编译器警告是正确的解决方案,因为比较int
和unsigned 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 int
到int
,如果你的unsigned int
的值大于INT_MAX,你的代码将会出错。
正确的解决方案是将signed int
转换为unsigned 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
}
答案 1 :(得分:6)
你应该首先注意为什么你首先要比较不同的类型,而不是做所有这种奇怪的类型:你创造了一个INT !!
改为:
for (unsigned long i = 0; i < lines.count; i++)//lines is an array
...现在你正在比较相同的类型!
答案 2 :(得分:4)
您正在查看的配置选项不会对您引用的警告执行任何操作。您需要做的是进入您的构建设置并搜索&#34;符号比较&#34;警告。把它关掉。
答案 3 :(得分:3)
而不是转动警告也可以防止它们发生。
您的lines.count属于NSUInteger类型。先做一个int,然后进行比较:
int count = lines.count;
for (int i = 0; i < count; i++)