Un NSInteger
correspond à 32 bits sur les plates-formes 32 bits et à 64 bits sur les plates-formes 64 bits. Existe-t-il un spécificateur NSLog
qui correspond toujours à la taille de NSInteger
?
Installer
GCC_WARN_TYPECHECK_CALLS_TO_PRINTF
ActivéCela me cause un peu de 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 spécificateur %d
. Mais si j'utilise le spécificateur %d
, Je reçois un avertissement lors de la compilation pour 64 bits suggérant que j'utilise plutôt %ld
.
Si j'utilise %ld
Pour correspondre à la taille de 64 bits, lors de la compilation pour du code 32 bits, un avertissement me suggère d'utiliser plutôt %d
.
Comment puis-je corriger les deux avertissements à la fois? Existe-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:]
.
Réponse mise à jour:
Avec le Xcode actuel, vous pouvez utiliser les modificateurs z
et t
pour gérer NSInteger
et NSUInteger
sans avertissements, sur toutes les architectures.
Vous voulez utiliser %zd
pour signé, %tu
pour non signé, et %tx
pour hex.
Cette information est une gracieuseté de Greg Parker .
Réponse originale:
Le approche officielle recommandée consiste à utiliser %ld
comme spécificateur et pour convertir l’argument réel en un long
.
Les formateurs proviennent de la fonction d'impression UNIX/POSIX standard. Utilisez % lu pour unsigned long ,% ld pendant longtemps,% lld depuis longtemps, et % llu pour unsigned long long . Essayez man printf sur la console, mais sur Mac, il est incomplet. Les pages de manuel linux sont plus explicites http://www.manpages.info/linux/sprintf.3.html
Les deux avertissements ne peuvent être résolus que par NSLog (@ "% lu", (unsigned long) arg); combiné avec une distribution car le code sera compilé en 32 ET 64 bits pour iOS. Sinon, chaque compilation crée un avertissement distinct.