Как правильно использовать printf для печати размера t?
Size_t
определяется как unsigned
целое число, но его размер зависит от того, находитесь ли вы на 32-или 64-разрядной машине. Каков правильный и портативный способ распечатать size_t
?
3 ответа:
попробуйте использовать
%zu
формат строкиsize_t val = get_the_value(); printf("%zu",val);
часть z-это спецификатор длины, который говорит, что аргумент будет size_t в длину.
источник http://en.wikipedia.org/wiki/Printf#printf_format_placeholders
на этом есть тег C++, так что
cout <<
еще один возможный ответ.Это удивительно трудно получить право во всех версиях C. В C90, бросая в
unsigned long
должно работать, но это вполне может не работать в C99, и решения C99 не обязательно будут работать в C90. Возможность надежно различать C90 и C99 была введена в изменениях 1995 года (указание допустимых значений для__STDC__
). Я не думаю, что есть полностью портативный способ, который работает для С90, C99 и C++, хотя есть решения для любого отдельного из них.
Я думаю, что ответ на C++:
std::size_t n = 1; std::cout << n;
для C-style IO это немного сложнее. В C99 они добавили
z
модификатор длины дляsize_t
значения. Однако до TR1 это не поддерживается, поэтому вы остаетесь с приведением к определенному размеру, например:std::size_t n = 1; std::printf("%lu\n", static_cast<unsigned long>(n));
потом опять
unsigned long long
на самом деле не поддерживается C++ в любом случае, так что выше будет работать нормально, так какunsigned long
является крупнейшим юридическим интегральным типом. После TR1 вы можете использовать%zu
безопасно дляsize_t
значения.