Правильный способ использования scanf / printf (и семейства) с фиксированными типами размеров?

чтение это так вопрос, я начал задаваться вопросом - Как правильно использовать scanf/printf (и семьи) с фиксированными размерами?

например, если у меня есть short int или int, Я хотел бы использовать %hd и %d соответственно - штраф.

но что, если у меня есть int16_t? short int может отличаться от int16_t, это зависит от платформы. То же самое для любого другого фиксированного размера (Интеграл) типы?


Примечание: похоже, я получил несколько голосов, потому что я"не пытался google это", похоже, мне нужно объяснить: я не видел подобного вопроса здесь, поэтому я его разместил. На большинство вопросов в SO можно было бы ответить с помощью Google, а не спрашивать здесь. Это сделало бы StackOverflow не тем местом, которым он на самом деле является сейчас.

и нет, я сделал это не для репутации-я уже попал в ежедневную репутацию сегодня (имея 24 голоса до публикации этого вопроса).

моя точка зрения - я не думаю, что это заслуживает вниз-голосов.

2 ответов


правильный способ-использовать inttypes.h, который определяет стандартные макросы для printf семья и scanf семья, например,

printf ("%" PRId16, short_int);
scanf ("%" SCNd16, &short_int);

на inttypes.h файл заголовка содержит макросы, определяющие правильные спецификаторы формата для целых чисел фиксированной ширины, определенных в stdint.h. Например, спецификатор типа для printf() и int16_t называется макрос PRId16. Пример:

int16_t x;
scanf("%" SCNd16, &x);

printf("You have entered: %" PRId16 "\n", x);