A NSInteger
는 32 비트 플랫폼에서 32 비트이고 64 비트 플랫폼에서 64 비트입니다. NSLog
의 크기와 항상 일치 하는 지정자가 NSInteger
있습니까?
설정
- Xcode 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
지정자를 사용하면 64 비트를 컴파일 할 때 %ld
대신 사용하라는 경고 메시지가 표시됩니다 .
%ld
64 비트 크기를 일치시키는 데 사용 하면 32 비트 코드를 컴파일 할 때 %d
대신 사용하라는 경고 메시지가 표시 됩니다.
두 경고를 한 번에 해결하려면 어떻게합니까? 어느 쪽에서 나 사용할 수있는 지정자가 있습니까?
이 또한 영향 [NSString stringWithFormat:]
및 [[NSString alloc] initWithFormat:]
.
static inline NSIntToLong(NSInteger i) {return (long)i;}
. 이렇게하면 유형 검사가 완전히 비활성화되지 않습니다 (예 : i 유형이 변경되는 경우).