Альтернативы приведению типов при форматировании NS (U) Integer на 32- и 64-разрядных архитектурах?
С 64-битной версией iOS мы не можем использовать%d
а также%u
больше форматироватьNSInteger
а такжеNSUInteger
, Потому что для 64-битных это typedef'd дляlong
а такжеunsigned long
вместоint
а такжеunsigned int
.
Так что Xcode будет выдавать предупреждения, если вы попытаетесь отформатировать NSInteger с% d. Xcode хорош для нас и предлагает замену для этих двух случаев, которая состоит из спецификатора формата с префиксом l и типа type для long. Тогда наш код в основном выглядит так:
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-битному переходу для Apple, которые все рекомендуют%lu (unsigned long)
подход. Я прошу альтернативу приведению типа.