A NSInteger
est 32 bits sur les plates-formes 32 bits et 64 bits sur les plates-formes 64 bits. Existe-t-il un NSLog
spécificateur qui correspond toujours à la taille de NSInteger
?
Installer
- Xcode 3.2.5
- compilateur llvm 1.6 (c'est important; gcc ne le fait pas)
GCC_WARN_TYPECHECK_CALLS_TO_PRINTF
allumé
Cela me cause du chagrin ici:
#import <Foundation/Foundation.h>
int main (int argc, const char * argv[]) {
@autoreleasepool {
NSInteger i = 0;
NSLog(@"%d", i);
}
return 0;
}
Pour le code 32 bits, j'ai besoin du %d
spécificateur. Mais si j'utilise le %d
spécificateur, j'obtiens un avertissement lors de la compilation pour 64 bits suggérant que j'utilise à la %ld
place.
Si j'utilise %ld
pour correspondre à la taille 64 bits, lors de la compilation pour le code 32 bits, je reçois un avertissement suggérant que j'utilise à la %d
place.
Comment corriger les deux avertissements à la fois? Y a-t-il un spécificateur que je peux utiliser qui fonctionne sur l'un ou l'autre?
Cela a également un impact sur [NSString stringWithFormat:]
et [[NSString alloc] initWithFormat:]
.
static inline NSIntToLong(NSInteger i) {return (long)i;}
. Cela évite de désactiver complètement la vérification de type (c'est-à-dire si le type de i change).