A NSInteger
ma 32 bity na platformach 32-bitowych i 64 bity na platformach 64-bitowych. Czy istnieje NSLog
specyfikator, 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_PRINTF
włą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ę %d
specyfikatora. Ale jeśli używam %d
specyfikatora, pojawia się ostrzeżenie podczas kompilacji dla wersji 64-bitowej, sugerujące użycie %ld
zamiast tego.
Jeśli używam %ld
dopasowania rozmiaru 64-bitowego, podczas kompilacji dla kodu 32-bitowego pojawia się ostrzeżenie sugerujące użycie %d
zamiast 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).