A NSIntegerlà 32 bit trên nền tảng 32 bit và 64 bit trên nền tảng 64 bit. Có một NSLogspecifier luôn luôn phù hợp với kích thước của NSInteger?
Thiết lập
- Xcode 3.2.5
- trình biên dịch llvm 1.6 (điều này rất quan trọng; gcc không làm điều này)
GCC_WARN_TYPECHECK_CALLS_TO_PRINTFđã bật lên
Điều đó gây cho tôi một số đau buồn ở đây:
#import <Foundation/Foundation.h>
int main (int argc, const char * argv[]) {
@autoreleasepool {
NSInteger i = 0;
NSLog(@"%d", i);
}
return 0;
}
Đối với mã 32 bit, tôi cần %dspecifier. Nhưng nếu tôi sử dụng trình %dxác định, tôi sẽ nhận được cảnh báo khi biên dịch 64 bit cho thấy tôi sử dụng %ldthay thế.
Nếu tôi sử dụng %ldđể khớp với kích thước 64 bit, khi biên dịch mã 32 bit, tôi nhận được cảnh báo đề nghị tôi sử dụng %dthay thế.
Làm cách nào để sửa cả hai cảnh báo cùng một lúc? Có một specifier tôi có thể sử dụng mà làm việc trên một trong hai?
Điều này cũng tác động [NSString stringWithFormat:]và [[NSString alloc] initWithFormat:].
static inline NSIntToLong(NSInteger i) {return (long)i;}. Điều này tránh việc vô hiệu hóa kiểm tra loại hoàn toàn (nghĩa là nếu loại i thay đổi).