NSInteger
은 32 비트 플랫폼에서는 32 비트이고 64 비트 플랫폼에서는 64 비트입니다. 항상 NSInteger
크기와 일치하는 NSLog
지정자가 있습니까?NSInteger에 대한 NSLog/printf 지정자?
설정
- 엑스 코드 3.2.5
- LLVM 1.6 컴파일러 (이 중요하다 GCC는이 작업을 수행하지 않습니다)
GCC_WARN_TYPECHECK_CALLS_TO_PRINTF
나를 일으키는 그
켜져 어떤 슬픔은 여기 :
#import <Foundation/Foundation.h>
int main (int argc, const char * argv[]) {
@autoreleasepool {
NSInteger i = 0;
NSLog(@"%d", i);
}
return 0;
}
32 비트 코드의 경우 %d
지정자가 필요합니다. 그러나 내가 %d
지정자를 사용하면, 대신 %ld
을 사용하도록 제안하면서 64 비트 용으로 컴파일 할 때 경고 메시지가 나타납니다.
%ld
을 64 비트 크기와 일치 시키려면 32 비트 코드 용으로 컴파일 할 때 %d
을 사용하라는 경고가 표시됩니다.
한 번에 두 경고를 모두 수정하는 방법은 무엇입니까? 거기에서 사용할 수있는 지정자가 있습니까?
이것은 또한 [NSString stringWithFormat:]
및 [[NSString alloc] initWithFormat:]
에 영향을줍니다.
이것은 확실히가는 길입니다.하지만 정적 인라인 NSIntToLong (NSInteger i) {return (long) i;}'을 사용하는 것이 좋습니다.이렇게하면 유형 검사가 완전히 비활성화되지 않습니다 (즉, i 유형이 변경되는 경우). –
@ steven-fisher의 좋은 생각. 'static inline long NSIntToLong (NSInteger i) {return (long) i;}' – Erik
또한 NSNumber를 생성하고 기록 할 수 있습니다. 'NSLog (@ "% @", @ (mynsint));'http://stackoverflow.com/questions/20355439/nsinteger-and-nsuinteger-in-a-mixed-64bit-32bit-environment – orkoden