Правильный спецификатор формата 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 не поддерживается.