Спецификатор 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. В противном случае каждая компиляция создает отдельное предупреждение.