A NSIntegerma 32 bity na platformach 32-bitowych i 64 bity na platformach 64-bitowych. Czy istnieje NSLogspecyfikator, który zawsze odpowiada rozmiarowi NSInteger?
Ustawiać
- Xcode 3.2.5
- Kompilator llvm 1.6 (to ważne; gcc tego nie robi)
GCC_WARN_TYPECHECK_CALLS_TO_PRINTFwłączone
To przysparza mi trochę żalu:
#import <Foundation/Foundation.h>
int main (int argc, const char * argv[]) {
@autoreleasepool {
NSInteger i = 0;
NSLog(@"%d", i);
}
return 0;
}
W przypadku kodu 32-bitowego potrzebuję %dspecyfikatora. Ale jeśli używam %dspecyfikatora, pojawia się ostrzeżenie podczas kompilacji dla wersji 64-bitowej, sugerujące użycie %ldzamiast tego.
Jeśli używam %lddopasowania rozmiaru 64-bitowego, podczas kompilacji dla kodu 32-bitowego pojawia się ostrzeżenie sugerujące użycie %dzamiast tego.
Jak naprawić oba ostrzeżenia jednocześnie? Czy istnieje specyfikator, którego mogę użyć i który działa na którymkolwiek z nich?
Ma to również wpływ [NSString stringWithFormat:]i [[NSString alloc] initWithFormat:].
static inline NSIntToLong(NSInteger i) {return (long)i;}. Pozwala to uniknąć całkowitego wyłączenia sprawdzania typu (tj. Jeśli typ i się zmieni).