A NSIntegerest 32 bits sur les plates-formes 32 bits et 64 bits sur les plates-formes 64 bits. Existe-t-il un NSLogspé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_PRINTFallumé
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 %dspécificateur. Mais si j'utilise le %dspécificateur, j'obtiens un avertissement lors de la compilation pour 64 bits suggérant que j'utilise à la %ldplace.
Si j'utilise %ldpour 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 %dplace.
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).