Nslog / printf specifier for NSInteger?

A NSInteger to 32 bity na platformach 32-bitowych, a 64 bity na platformach 64-bitowych. Czy istnieje NSLog specyfik, który zawsze pasuje do rozmiaru NSInteger?

Setup

  • Xcode 3.2.5
  • Jest to bardzo ważne, ponieważ GCC tego nie robi.]}
  • GCC_WARN_TYPECHECK_CALLS_TO_PRINTF włączony

To sprawia mi smutek tutaj:

#import <Foundation/Foundation.h>

int main (int argc, const char * argv[]) {
    @autoreleasepool {
        NSInteger i = 0;
        NSLog(@"%d", i);
    }
    return 0;
}

Dla 32-bitowego kodu potrzebuję %d specifier. Ale jeśli używam specyfika %d, dostaję ostrzeżenie podczas kompilacji dla 64 bitów zamiast tego używam %ld.

Jeśli używam %ld aby dopasować rozmiar 64 bitów, podczas kompilacji dla kodu 32 bitowego dostaję Ostrzeżenie sugerujące użycie %d zamiast tego.

Jak naprawić oba ostrzeżenia na raz? Czy jest jakiś specyfik, którego mogę użyć, który działa na obu?

Dotyczy to również [NSString stringWithFormat:] i [[NSString alloc] initWithFormat:].

Author: Steven Fisher, 2010-12-10

2 answers

Ostatnia odpowiedź:

Z bieżącym Xcode, możesz używać modyfikatorów z i t do obsługi NSInteger i NSUInteger bez ostrzeżeń, na wszystkich architekturach.

Chcesz użyć %zd dla signed, %tu dla unsigned i %tx dla hex.

Ta informacja pochodzi od Grega Parkera.

Oryginalna odpowiedź:

The official recommended approach is to use %ld as your specifier, and to cast the actual argument to a long.

 281
Author: Kevin Ballard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-13 19:32:02

Formatery pochodzą ze standardowej UNIX / POSIX funkcji printf. Użyj %lu dla unsigned long, %ld dla long, %lld dla long long oraz %llu dla unsigned long long. Spróbuj man printf na konsoli, ale na Macu jest niekompletny. Linux manpages are more explicit http://www.manpages.info/linux/sprintf.3.html

Oba ostrzeżenia mogą być naprawione tylko przez NSLog (@"%lu", (unsigned long)arg); w połączeniu z cast, ponieważ kod zostanie skompilowany w 32 I 64 bit dla iOS. W przeciwnym razie każda kompilacja tworzy osobne Ostrzeżenie.

 0
Author: cat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-16 11:18:10