Какой правильный способ использовать 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
.