Правильный спецификатор формата printf для size_t:% zu или% Iu?
Я хочу распечатать значение переменной size_t
используя printf
в C++ с использованием Microsoft Visual Studio 2010 (я хочу использовать printf
вместо <<
в этом конкретном фрагменте кода, поэтому, пожалуйста, не отвечайте, говоря, что мне следует использовать <<
вместо).
По сообщению
Независимый от платформы size_t Спецификаторы формата в c?
правильный независимый от платформы способ - использовать %zu
, но в Visual Studio это не работает. Документация по Visual Studio по адресу
http://msdn.microsoft.com/en-us/library/vstudio/tcxf1dw6.aspx
говорит мне, что я должен использовать %Iu
(используя прописные буквы i
, а не строчные l
).
Microsoft не следует стандартам здесь? Или стандарт был изменен с C99? Или стандарт отличается между C и C++ (что мне кажется очень странным)?
Ответы
Ответ 1
MS Visual Studio не поддерживала спецификатор %zu
printf до VS2013
. Начиная с VS2013 (например, _MSC_VER
> = 1800
) доступно %zu
.
В качестве альтернативы, для предыдущих версий Visual Studio, если вы печатаете небольшие значения (например, количество элементов из контейнеров std), вы можете просто привести к int
и использовать %d
:
printf("count: %d\n", (int)str.size()); // less digital ink spent
// or:
printf("count: %u\n", (unsigned)str.size());
Ответ 2
Документация Microsoft гласит:
Префиксы длины hh
, j
, z
и t
не поддерживаются.
И поэтому %zu
не поддерживается.
В нем также говорится, что правильный размер префикса для size_t
- I
поэтому вы должны использовать %Iu
.
Ответ 3
Компилятор Microsoft C не догоняет последние стандарты C. Это в основном компилятор C89 с некоторыми вишенными функциями от C99 (например, long long
). Поэтому не должно быть неожиданностей, что что-то не поддерживается (%zu
появился на C99).
Ответ 4
Основываясь на ответе здесь, %z
является добавлением C99. Поскольку MSVC не поддерживает ни один из более поздних стандартов C, неудивительно, что %z
не поддерживается.