A NSInteger
ist 32 Bit auf 32-Bit-Plattformen und 64 Bit auf 64-Bit-Plattformen. Gibt es einen NSLog
Bezeichner, der immer der Größe von entspricht NSInteger
?
Konfiguration
- Xcode 3.2.5
- llvm 1.6 Compiler (das ist wichtig; gcc macht das nicht)
GCC_WARN_TYPECHECK_CALLS_TO_PRINTF
eingeschaltet
Das macht mir hier Sorgen:
#import <Foundation/Foundation.h>
int main (int argc, const char * argv[]) {
@autoreleasepool {
NSInteger i = 0;
NSLog(@"%d", i);
}
return 0;
}
Für 32-Bit-Code benötige ich den %d
Bezeichner. Wenn ich jedoch den %d
Bezeichner verwende, wird beim Kompilieren für 64-Bit eine Warnung angezeigt, die darauf hinweist, dass ich %ld
stattdessen verwende.
Wenn ich %ld
die 64-Bit-Größe anpasse, wird beim Kompilieren für 32-Bit-Code eine Warnung angezeigt, die darauf hinweist, dass ich %d
stattdessen verwende.
Wie behebe ich beide Warnungen gleichzeitig? Gibt es einen Bezeichner, mit dem ich arbeiten kann?
Dies wirkt sich auch auf [NSString stringWithFormat:]
und aus [[NSString alloc] initWithFormat:]
.
static inline NSIntToLong(NSInteger i) {return (long)i;}
. Dadurch wird vermieden, dass die Typprüfung vollständig deaktiviert wird (dh wenn sich der Typ von i ändert).