web-dev-qa-db-fra.com

Spécificateur NSLog / printf pour NSInteger?

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

  • Xcode 3.2.5
  • compilateur llvm 1.6 (c'est important; gcc ne le fait pas)
  • 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:].

125
Steven Fisher

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.

286
Lily Ballard

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.

0
cat