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

113
задан Steven Fisher 10 дек. '10 в 4:58
источник поделиться
2 ответов

Обновленный ответ:

С текущим Xcode вы можете использовать модификаторы z и t для обработки NSInteger и NSUInteger без предупреждений на всех архитектурах.

Вы хотите использовать %zd для подписанных, %tu для unsigned и %tx для hex.

Эта информация предоставляется любезно Грег Паркер.


Оригинальный ответ:

официальный рекомендуемый подход заключается в использовании %ld в качестве вашего спецификатора и приведения фактического аргумента в long.

272
ответ дан Kevin Ballard 10 дек. '10 в 5:04
источник поделиться

Форматировщики поступают из стандартной функции printf UNIX/POSIX. Используйте % lu для unsigned long,% ld для длинных,% lld для долгого времени и % llu для unsigned long long. Попробуйте man printf на консоли, но на Mac он неполный. Линукс файлы более явные http://www.manpages.info/linux/sprintf.3.html

Оба предупреждения могут быть установлены только NSLog (@ "% lu", (unsigned long) arg); в сочетании с литой, поскольку код будет скомпилирован в 32 и 64 бит для iOS. В противном случае каждая компиляция создает отдельное предупреждение.

0
ответ дан cat 16 дек. '14 в 14:18
источник поделиться

Другие вопросы по меткам