Альтернативы приведению типов при форматировании 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) подход. Я прошу альтернативу приведению типа.

Ответы на вопрос(3)

Ваш ответ на вопрос