A NSInteger
adalah 32 bit pada platform 32-bit, dan 64 bit pada platform 64-bit. Apakah ada NSLog
specifier 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_PRINTF
dihidupkan
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 %d
specifier. Tetapi jika saya menggunakan %d
specifier, saya mendapat peringatan ketika mengkompilasi untuk 64 bit menyarankan saya gunakan %ld
sebagai gantinya.
Jika saya gunakan %ld
untuk mencocokkan ukuran 64 bit, ketika mengkompilasi kode 32 bit saya mendapatkan peringatan yang menyarankan saya gunakan %d
sebagai 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).