В 64-битной версии iOS мы больше не можем использовать %d
и %u
для форматирования NSInteger
и NSUInteger
. Потому что для 64 бит это typedef'd для long
и unsigned long
вместо int
и unsigned int
.
Итак, Xcode выдаст предупреждения, если вы попытаетесь отформатировать NSInteger с% d. Xcode хорош для нас и предлагает замену для этих двух случаев, которая состоит из спецификатора формата l-prefixed и типичного для длинного. Тогда наш код выглядит примерно так:
NSLog(@"%ld", (long)i);
NSLog(@"%lu", (unsigned long)u);
Что, если вы спросите меня, это боль в глазу.
Несколько дней назад кто-то в Twitter упомянул спецификаторы формата %zd
для форматирования подписанных переменных и %tu
для форматирования неподписанных переменных на 32 и 64-битных форматах.
NSLog(@"%zd", i);
NSLog(@"%tu", u);
Кажется, что это работает. И мне нравится больше, чем приведение в исполнение.
Но я честно понятия не имею, почему они работают. Прямо сейчас оба являются для меня магическими значениями.
Я немного исследовал и понял, что префикс z
означает, что следующий спецификатор формата имеет тот же размер, что и size_t
. Но я абсолютно не знаю, что означает префикс t
. Поэтому у меня есть два вопроса:
Что именно означают %zd
и %tu
?
И безопасно ли использовать %zd
и %tu
вместо предложения яблок, чтобы оно начиналось с длинной?
Мне знакомы с подобными вопросами и руководствами 64-битного перехода Apples, которые рекомендуют подход %lu (unsigned long)
. Я прошу альтернативу литью типа.