Правильный спецификатор формата printf для размера 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++ (что казалось бы очень странным для я)?

4 ответов


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());

С документация microsoft

префиксы длины hh, j, z и t не поддерживаются.

в нем указано, что правильный префикс для size_t Я-так вы бы использовали %Iu


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


на основе ответа от здесь, %z - Это С99 дополнение. Поскольку MSVC не поддерживает ни один из более поздних стандартов C, неудивительно, что %z не поддерживается.