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

34

Решение

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

Другие решения

Документация Microsoft состояния:

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

И поэтому %zu не поддерживается.

В нем также говорится, что правильный префикс для использования для size_t является I — так что вы бы использовать %Iu,

18

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

16

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

6
По вопросам рекламы [email protected]