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:]
.
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.
Oryginalna odpowiedź:
The official recommended approach is to use %ld
as your specifier, and to cast the actual argument to a long
.
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.
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