A NSInteger
là 32 bit trên nền tảng 32 bit và 64 bit trên nền tảng 64 bit. Có một NSLog
specifier 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 %d
specifier. Nhưng nếu tôi sử dụng trình %d
xá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 %ld
thay 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 %d
thay 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).