A NSIntegerist 32 Bit auf 32-Bit-Plattformen und 64 Bit auf 64-Bit-Plattformen. Gibt es einen NSLogBezeichner, 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_PRINTFeingeschaltet
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 %dBezeichner. Wenn ich jedoch den %dBezeichner verwende, wird beim Kompilieren für 64-Bit eine Warnung angezeigt, die darauf hinweist, dass ich %ldstattdessen verwende.
Wenn ich %lddie 64-Bit-Größe anpasse, wird beim Kompilieren für 32-Bit-Code eine Warnung angezeigt, die darauf hinweist, dass ich %dstattdessen 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).