Вариант 1:
Поскольку в большинстве (если не во всех?) Системах строка формата PRIuPTR
printf из также достаточно длинна для хранения типа size_t
, я рекомендую использовать следующие определения для size_t
строк формата printf.
Однако важно убедиться, что это будет работать для вашей конкретной архитектуры (компилятор, аппаратное обеспечение и т. Д.), Так как стандарт не обеспечивает это.
#include <inttypes.h>
// Printf format strings for `size_t` variable types.
#define PRIdSZT PRIdPTR
#define PRIiSZT PRIiPTR
#define PRIoSZT PRIoPTR
#define PRIuSZT PRIuPTR
#define PRIxSZT PRIxPTR
#define PRIXSZT PRIXPTR
Пример использования:
size_t my_variable;
printf("%" PRIuSZT "\n", my_variable);
Вариант 2:
Однако, где это возможно, просто используйте спецификатор длины %zu
"z", , как показано здесь , для size_t
типов:
Пример использования:
size_t my_variable;
printf("%zu\n", my_variable);
Однако в некоторых системах, таких как микроконтроллеры STM32, использующие gcc в качестве компилятора, спецификатор длины %z
не обязательно реализован, и выполнение чего-то вроде printf("%zu\n", my_size_t_num);
может просто привести к выводу литерала " % zu "(я лично проверил это и обнаружил, что это правда) вместо значения вашей size_t
переменной.
Вариант 3:
Где вам нужно, чтобы гарантированно работало , однако, или где вы не уверены в своей конкретной архитектуре, просто приведите и распечатайте как uint64_t
и все будет готово, как это гарантированно работает, но требует дополнительного этапа кастинга.
Пример использования:
#include <stdint.h> // for uint64_t
#include <inttypes.h> // for PRIu64
size_t my_variable;
printf("%" PRIu64 "\n", (uint64_t)my_variable);
Источники цитирования:
- http://www.cplusplus.com/reference/cstdio/printf/
- http://www.cplusplus.com/reference/cinttypes/
- http://www.cplusplus.com/reference/cstdint/