Правильный спецификатор формата printf для size_t:% zu или% Iu?

Я хочу распечатать значение переменной size_t с помощью printf в С++ с помощью Microsoft Visual Studio 2010 (я хочу использовать printf вместо << в этом конкретном фрагменте кода, так что, пожалуйста, no ответы говорят мне, что я должен использовать <<).

Согласно сообщению

Независимые от платформы size_t Спецификаторы формата в c?

правильный независимый от платформы способ - использовать %zu, но это, похоже, не работает в Visual Studio. Документация Visual Studio в

http://msdn.microsoft.com/en-us/library/vstudio/tcxf1dw6.aspx

говорит мне, что я должен использовать %Iu (используя верхний регистр i, а не строчный l).

Не соответствует ли Microsoft стандартам? Или был изменен стандарт с C99? Или это стандарт, отличный от C и С++ (который мне кажется очень странным)?

4b9b3361

Просто, чтобы прояснить ситуацию и повторить то, что было сказано в комментариях. 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());
3
ответ дан 18 мая '17 в 21:20
источник

Компилятор Microsoft C не догоняет последние стандарты C. Это в основном компилятор C89 с некоторыми вишенными функциями от C99 (например, long long). Поэтому не должно быть неожиданностей, что что-то не поддерживается (%zu появился на C99).

14
ответ дан 25 марта '13 в 10:57
источник

Основываясь на ответе здесь, %z является добавлением C99. Поскольку MSVC не поддерживает ни один из более поздних стандартов C, неудивительно, что %z не поддерживается.

4
ответ дан 25 марта '13 в 10:58
источник