Спецификатор NSLog / printf для NSInteger?
A NSInteger
- это 32 бита на 32-битных и 64 бита на 64-битных платформах. Есть ли NSLog
спецификатор, который всегда соответствует размеру NSInteger
?
настройка
- Xcode 3.2.5
- компилятор llvm 1.6 (это важно; gcc этого не делает)
-
GCC_WARN_TYPECHECK_CALLS_TO_PRINTF
повернул на
это вызывает у меня вот какое горе:
#import <Foundation/Foundation.h>
int main (int argc, const char * argv[]) {
@autoreleasepool {
NSInteger i = 0;
NSLog(@"%d", i);
}
return 0;
}
для 32-битного кода, мне нужно %d
описатель. Но если я использую %d
спецификатор, я получаю предупреждение при компиляции для 64 бит, предлагая использовать %ld
вместо.
если я использую %ld
чтобы соответствовать 64-битному размеру, при компиляции для 32-битного кода я получаю предупреждение, предлагающее использовать %d
вместо.
как исправить оба предупреждения сразу? Есть ли спецификатор, который я могу использовать, который работает на любом?
это также влияет [NSString stringWithFormat:]
и [[NSString alloc] initWithFormat:]
.
2 ответа:
обновленный ответ:
с текущим Xcode, вы можете использовать
z
иt
модификаторы для обработкиNSInteger
иNSUInteger
без предупреждений, на всех архитектурах.вы хотите использовать
%zd
для подписания,%tu
для неподписанных, и%tx
для hex.эта информация приходит любезно Грег Паркер.
оригинальный ответ:
The официальный рекомендуемый подход это используйте
%ld
как ваш спецификатор, и привести фактический аргумент кlong
.
форматеры исходят из стандартной функции Unix/POSIX printf. Используйте %lu на unsigned long, %ld для long, %lld для long long, и %llu на unsigned long long. Попробовать человек printf в консоль, а на Mac она будет неполной. Страницы руководства linux являются более явными http://www.manpages.info/linux/sprintf.3.html
оба предупреждения могут быть исправлены только с помощью NSLog (@"%lu", (unsigned long)arg); в сочетании с a приведение в качестве кода будет скомпилировано в 32 и 64 бит для iOS. В противном случае каждая компиляция создает отдельное предупреждение.