Ein NSInteger
ist 32 Bit auf 32-Bit-Plattformen und 64 Bit auf 64-Bit-Plattformen. Gibt es einen NSLog
Spezifizierer, der immer der Größe von NSInteger
entspricht?NSLog/printf-Spezifizierer für NSInteger?
Setup-
- Xcode 3.2.5
- llvm 1.6 Compiler (dies ist wichtig, gcc tut dies nicht)
GCC_WARN_TYPECHECK_CALLS_TO_PRINTF
eingeschaltet
Das bin ich verursacht einige Trauer hier:
#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
Spezifizierer. Aber wenn ich den %d
Spezifizierer verwende, erhalte ich eine Warnung, wenn ich für 64 Bit kompiliere, was vorschlägt, dass ich stattdessen %ld
benutze.
Wenn ich %ld
verwenden, um die 64-Bit-Größe anzupassen, bekomme ich beim Kompilieren für 32-Bit-Code eine Warnung, die darauf hinweist, dass ich stattdessen %d
verwende.
Wie kann ich beide Warnungen gleichzeitig beheben? Gibt es einen Spezifizierer, den ich verwenden kann? Dies betrifft auch [NSString stringWithFormat:]
und [[NSString alloc] initWithFormat:]
.
Dies ist definitiv der Weg zu gehen, aber ich denke, ich könnte 'statische Inline NSIntToLong (NSInteger i) {zurück (lang) ich;}'.Dies vermeidet eine vollständige Deaktivierung der Typprüfung (d. H. Wenn sich der Typ von i ändert). –
Gutes Denken von @ steven-fisher. Vermeiden Sie eine Warnung mit: 'static inline long NSIntToLong (NSInteger i) {return (long) i;}' – Erik
Sie können auch eine NSNumber erstellen und diese protokollieren. 'NSLog (@"% @ ", @ (mynsint));' http://stackoverflow.com/questions/20355439/nsinteger-and-nsuinteger-in-a-mixed-64bit-32bit-umgebung – orkoden