형식 인수로 사용할 때 NSInterger 변수를 길게 캐스트해야 하는 이유는 무엇입니까?
NSInteger myInt = 1804809223;
NSLog(@"%i", myInt); <====
위의 코드는 다음 오류를 발생시킵니다.
'NSInterger' 형식의 값은 형식 인수로 사용할 수 없습니다. 대신 '긴'에 명시적 캐스트를 추가하십시오.
수정한NSLog메시지는 사실NSLog(@"%lg", (long) myInt);의 정수값을 변환해야 하는 이유는 무엇입니까?myInt로.long값을 표시하려면 어떻게 해야 하나요?
이 경고는 OS X(64비트)에서 컴파일할 때 발생합니다.그 플랫폼에서는NSInteger로 정의됩니다.long64비트 정수입니다.그%i한편 포맷은int(32비트).따라서 형식과 실제 파라미터의 크기가 일치하지 않습니다.
부터NSInteger32비트 또는 64비트입니다.플랫폼에 따라서는 컴파일러는 캐스트를 추가할 것을 권장합니다.long일반적으로.
업데이트: iOS 7은 64비트도 지원하므로 iOS용 컴파일 시 동일한 경고를 받을 수 있습니다.
형식 지정자가 데이터 유형과 일치하는 경우 어떤 형식으로도 캐스팅할 필요가 없습니다.자세한 내용은 Martin R의 답변을 참조하십시오.NSInteger는 네이티브 타입으로 정의됩니다.
따라서 64비트 환경용으로 작성된 코드의 경우 다음과 같이 로그 문을 작성할 수 있습니다.
NSLog(@"%ld", myInt);
한편, 32비트 환경의 경우 다음을 쓸 수 있습니다.
NSLog(@"%d", myInt);
깁스 없이도 다 될 거야
캐스트를 사용하는 이유 중 하나는 좋은 코드가 플랫폼 간에 포팅되는 경향이 있기 때문에 변수를 명시적으로 캐스트하면 32비트와 64비트 모두에서 깔끔하게 컴파일됩니다.
NSLog(@"%ld", (long)myInt);
이는 NSLog 스테이트먼트뿐만 아니라 디버깅 지원뿐 아니라[NSString stringWithFormat:]및 다양한 파생 메시지(생산 코드의 합법적인 요소)를 포함합니다.
NS Log에 NSInterger를 전달하는 대신 NS Number를 전달합니다.이렇게 하면 모든 캐스트를 둘러보고 올바른 문자열 형식 지정자를 선택할 수 있습니다.
NSNumber foo = @9000;
NSLog(@"foo: %@", foo);
NSInteger bar = 9001;
NSLog(@"bar: %@", @(bar));
NSIntegers에서도 안심하고 사용할 수 있습니다.64비트/32비트 혼합 환경에서 NSInterger 및 NSInterger에 대한 답변을 참조하십시오.
사용 중 경고음이 계속 울립니다.NSLog(@"%ld", (long)myInt);에 대한 변경 선언 후 경고를 중지합니다.long myInt = 1804809223;iOS 10에서 사용할 수 있습니다.
OS X 에서는, 다음의 몇개의 데이터 타입은 다음과 같습니다.NSInterger, NSUIInterger, CGFloat 및 CFIndex: 32비트 및 64비트 환경에서 일관된 값 표현 수단을 제공합니다.32비트 환경에서는 NSInterger 및 NSUIInterger는 각각 int 및 unsigned int로 정의됩니다.64비트 환경에서는 NSInterger와 NSUIInterger는 각각 long 및 unsigned long으로 정의됩니다.플랫폼에 따라 다른 printf 스타일 지정자를 사용할 필요가 없도록 32비트 환경과 64비트 환경 모두에서 이 링크에 표시된 지정자를 사용할 수 있습니다.
언급URL : https://stackoverflow.com/questions/16075559/why-does-an-nsinteger-variable-have-to-be-cast-to-long-when-used-as-a-format-arg
'programing' 카테고리의 다른 글
| 명령줄에서 XLS를 CSV로 변환 (0) | 2023.04.20 |
|---|---|
| Mac OS X에서 C#/WPF 애플리케이션을 실행할 수 있습니까? (0) | 2023.04.20 |
| Excel VBA에서 워크북 이름이 아닌 워크시트 이름을 포함한 범위의 주소를 얻으려면 어떻게 해야 합니까? (0) | 2023.04.20 |
| 비밀번호로 보호된 엑셀 파일을 r로 읽으려면 어떻게 해야 하나요? (0) | 2023.04.20 |
| 인터랙티브 에디터 없이 Bash를 사용하여 cron 작업을 자동으로 작성하는 방법은 무엇입니까? (0) | 2023.04.20 |