Какой правильный способ использовать printf для печати size_t?

Size_t определяется как целое число unsigned, но размер его зависит от того, используете ли вы 32-разрядную или 64-разрядную машину. Какой правильный и переносимый способ распечатать Size_t?

Ответ 1

Попробуйте использовать строку формата %zu

size_t val = get_the_value();
printf("%zu",val);

Часть z является спецификатором длины, который говорит, что аргумент будет size_t в длину.

Источник - http://en.wikipedia.org/wiki/Printf#printf_format_placeholders

Ответ 2

Там есть тег С++, поэтому cout << - еще один возможный ответ.

Удивительно сложно получить правильное решение во всех версиях C. В C90 выполнение функции unsigned long должно работать, но это может не работать на C99, а решения C99 не обязательно будут работать на C90. Возможность достоверно различать C90 и C99 была введена в изменениях 1995 года (с указанием допустимых значений для __STDC__). Я не думаю, что есть полностью переносимый способ, который работает на C90, C99 и С++, хотя есть решения для любого из них.

Ответ 3

Я думаю, что ответ С++:

std::size_t n = 1;
std::cout << n;

Для C-стиля IO это немного сложнее. В C99 они добавили модификатор длины z для значений size_t. Однако, предшествующий TR1, это не поддерживается, поэтому вы остаетесь с литьем до определенного размера, например:

std::size_t n = 1;
std::printf("%lu\n", static_cast<unsigned long>(n));

И снова, unsigned long long на самом деле не поддерживается С++, поэтому выше будет работать нормально, так как unsigned long является самым крупным законным интегральным типом. После TR1 вы можете безопасно использовать %zu для значений size_t.