A NSInteger
è 32 bit su piattaforme a 32 bit e 64 bit su piattaforme a 64 bit. Esiste un NSLog
identificatore che corrisponde sempre alla dimensione di NSInteger
?
Impostare
- Xcode 3.2.5
- compilatore llvm 1.6 (questo è importante; gcc non lo fa)
GCC_WARN_TYPECHECK_CALLS_TO_PRINTF
acceso
Questo mi sta causando un po 'di dolore qui:
#import <Foundation/Foundation.h>
int main (int argc, const char * argv[]) {
@autoreleasepool {
NSInteger i = 0;
NSLog(@"%d", i);
}
return 0;
}
Per il codice a 32 bit, ho bisogno %d
dell'identificatore. Ma se uso l' %d
identificatore, ricevo un avviso durante la compilazione per 64 bit che suggerisce di utilizzare %ld
invece.
Se uso %ld
per abbinare la dimensione a 64 bit, durante la compilazione per il codice a 32 bit ricevo un avviso che suggerisce di usare %d
invece.
Come posso risolvere entrambi gli avvisi contemporaneamente? C'è uno specificatore che posso usare che funziona su entrambi?
Anche questo ha un impatto [NSString stringWithFormat:]
e [[NSString alloc] initWithFormat:]
.
static inline NSIntToLong(NSInteger i) {return (long)i;}
. Questo evita di disabilitare completamente il controllo del tipo (cioè se il tipo di i cambia).