Спецификатор 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 122

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