객관적 c 암시 적 변환은 정수 정밀도 'NSUInteger'(일명 'unsigned long')를 'int'경고로 잃습니다.
몇 가지 연습을 진행 중이며 다음과 같은 경고가 표시됩니다.
암시 적 변환은 정수 정밀도 'NSUInteger'(일명 'unsigned long')를 'int'로 잃습니다.
나는 멍청한 놈이며 어떤 도움을 주셔서 감사합니다. 감사합니다.
#import <Foundation/Foundation.h>
int main (int argc, const char * argv[])
{
@autoreleasepool {
NSArray *myColors;
int i;
int count;
myColors = @[@"Red", @"Green", @"Blue", @"Yellow"];
count = myColors.count; // <<< issue warning here
for (i = 0; i < count; i++)
NSLog (@"Element %i = %@", i, [myColors objectAtIndex: i]);
}
return 0;
}
count
방법 NSArray
다시 표시 NSUInteger
하고, 64 비트 OS X 플랫폼
NSUInteger
로 정의unsigned long
되고unsigned long
부호없는 64 비트 정수입니다.int
32 비트 정수입니다.
따라서 int
"보다 작은"데이터 유형 NSUInteger
이므로 컴파일러 경고입니다.
"Foundation Data Types Reference"의 NSUInteger 도 참조하십시오 .
32 비트 응용 프로그램을 빌드 할 때 NSUInteger는 부호없는 32 비트 정수입니다. 64 비트 응용 프로그램은 NSUInteger를 부호없는 64 비트 정수로 취급합니다.
해당 컴파일러 경고를 수정하려면 로컬 count
변수를 다음과 같이 선언하십시오.
NSUInteger count;
또는 (배열에 2^31-1
요소 이상을 포함하지 않을 것이라고 확신하는 경우 ) 명시 적 캐스트를 추가하십시오.
int count = (int)[myColors count];
Martin의 대답과 달리 int로 캐스팅하거나 경고를 무시하는 것이 배열에 2 ^ 31-1 개 이상의 요소가 없다는 것을 알고 있어도 항상 안전하지는 않습니다. 64 비트로 컴파일 할 때는 아닙니다.
예를 들면 다음과 같습니다.
NSArray *array = @[@"a", @"b", @"c"];
int i = (int) [array indexOfObject:@"d"];
// indexOfObject returned NSNotFound, which is NSIntegerMax, which is LONG_MAX in 64 bit.
// We cast this to int and got -1.
// But -1 != NSNotFound. Trouble ahead!
if (i == NSNotFound) {
// thought we'd get here, but we don't
NSLog(@"it's not here");
}
else {
// this is what actually happens
NSLog(@"it's here: %d", i);
// **** crash horribly ****
NSLog(@"the object is %@", array[i]);
}
프로젝트> 빌드 설정에서 키 변경 " printf / scanf에 대한 typecheck 호출 : NO "
설명 : [작동 원리]
Check calls to printf and scanf, etc., to make sure that the arguments supplied have types appropriate to the format string specified, and that the conversions specified in the format string make sense.
Hope it work
Other warning
objective c implicit conversion loses integer precision 'NSUInteger' (aka 'unsigned long') to 'int
Change key "implicit conversion to 32Bits Type > Debug > *64 architecture : No"
[caution: It may void other warning of 64 Bits architecture conversion].
Doing the expicit casting to the "int" solves the problem in my case. I had the same issue. So:
int count = (int)[myColors count];
'Programing' 카테고리의 다른 글
var self = this? (0) | 2020.05.19 |
---|---|
단어를 인용 / 인용하는 데 어떤 Vim 명령을 사용할 수 있습니까? (0) | 2020.05.18 |
밀리 초를 날짜로 변환 (jQuery / JavaScript) (0) | 2020.05.18 |
C #에서 최종적으로 사용하는 이유는 무엇입니까? (0) | 2020.05.18 |
JavaScript에 논리적 xor가없는 이유는 무엇입니까? (0) | 2020.05.18 |