2011-12-02 3 views
4

오픈 소스를 사용하여 프로젝트를 빌드합니다.다른 부호의 정수 비교 Xcode로 경고

 
// 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 
을 :


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

내가 프로젝트가 포함되어 구성 파일을 빌드가주의 사항 : 소스 코드에서 예를 들어


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') 

: 나는이 프로젝트에 EGOTextView를 추가 할 때, 그것은 같은 시맨틱 문제가 있습니다

의견에 따르면, 나는 그것이 문제를 일으킨다 고 생각한다. 그러나이 의미는이 OTHER_CFLAGS 설정에 대해 알지 못합니다. 또한 의미 론적 문제를 피할 수 있도록 문제를 해결하는 방법을 알지 못합니다.

아무도 도와 줄 수 있습니까?

감사합니다.

답변

4

보고있는 구성 옵션은 인용 한 경고에 대해 아무 것도 처리하지 않습니다. 빌드 설정에서 "기호 비교"경고를 검색하면됩니다. 꺼 버려. 대신 또한 발생하는 것을 방지 할 수 있습니다의 경고를 돌려의

enter image description here

+0

감사합니다. 작동합니다! – scorpiozj

+5

경고를 끄는 대신 버그 수정 방법은 무엇입니까? 아래 [내 대답] (http://stackoverflow.com/a/20543204/172218)을 참조하십시오. –

+0

경고를 생성하는 파일이 외부 lib의 파일 인 경우, 대신 파일에서'-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

는 사실, 내가 int을 비교하고 unsigned long이 미묘한 버그를 소개하기 때문에 컴파일러 경고를 해제하는 것은, 최적의 솔루션입니다 생각하지 않습니다. 예를 들어

: 당신은 단순히 당신의 unsigned int의 값이 INT_MAX보다 큰 경우 int 코드에 unsigned int 잘못 작동합니다 (암시 적 또는 명시 적으로) 멀리 던져 기본적으로 경우

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! 
} 

.

올바른 솔루션은 부정적이다 케이스를 덮고 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

대신 모든 이상이 이상한 타입 캐스팅의 모든 일을 장소, 당신은 먼저 왜 처음에 다른 유형을 비교하는지주의해야합니다 : 당신은 마음을 창조하고 있습니다!

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가 단순히 원래의 질문에서 어레이를 반복하는 것이 분명합니다. 서명되지 않은 i가 적절합니다. –

관련 문제