A NSIntegeradalah 32 bit pada platform 32-bit, dan 64 bit pada platform 64-bit. Apakah ada NSLogspecifier yang selalu cocok dengan ukuran NSInteger?
Mempersiapkan
- Xcode 3.2.5
- llvm 1.6 compiler (ini penting; gcc tidak melakukan ini)
GCC_WARN_TYPECHECK_CALLS_TO_PRINTFdihidupkan
Itu membuat saya sedih di sini:
#import <Foundation/Foundation.h>
int main (int argc, const char * argv[]) {
@autoreleasepool {
NSInteger i = 0;
NSLog(@"%d", i);
}
return 0;
}
Untuk kode 32 bit, saya perlu %dspecifier. Tetapi jika saya menggunakan %dspecifier, saya mendapat peringatan ketika mengkompilasi untuk 64 bit menyarankan saya gunakan %ldsebagai gantinya.
Jika saya gunakan %lduntuk mencocokkan ukuran 64 bit, ketika mengkompilasi kode 32 bit saya mendapatkan peringatan yang menyarankan saya gunakan %dsebagai gantinya.
Bagaimana cara saya memperbaiki kedua peringatan sekaligus? Apakah ada specifier yang bisa saya gunakan yang berfungsi baik?
Ini juga berdampak [NSString stringWithFormat:]dan [[NSString alloc] initWithFormat:].
static inline NSIntToLong(NSInteger i) {return (long)i;}. Ini menghindari pemeriksaan penonaktifan tipe sepenuhnya (yaitu jika jenis i berubah).