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

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

Например, если у меня short int или int , я бы использовал %hd и %d соответственно – отлично.

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


ПРИМЕЧАНИЕ. Похоже, что я получил несколько голосов, потому что я « не пытался Google это », похоже, мне нужно объяснить: я не видел подобного вопроса здесь, поэтому я разместил его. На большинство вопросов в SO можно было ответить с помощью Google, а не спрашивать здесь. Это сделало бы StackOverflow не тем местом, которое на самом деле сейчас.

И НЕТ, я не делал этого для репутации – я уже сегодня попал в повседневную репутацию (с 24 голосами перед тем, как опубликовать этот вопрос).

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

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

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

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

 int16_t x; scanf("%" SCNd16, &x); printf("You have entered: %" PRId16 "\n", x);