Независимо от платформы size_t Спецификаторы формата в c?
Я хочу напечатать переменную типа size_t
в C, но оказывается, что size_t
псевдонимы для разных типов переменных на разных архитектурах. Например, на одной машине (64-разрядной версии) следующий код не вызывает никаких предупреждений:
size_t size = 1;
printf("the size is %ld", size);
но на моей другой машине (32-разрядной) приведенный выше код выдает следующее предупреждающее сообщение:
предупреждение: формат '% ld' ожидает типа 'long int *', но аргумент 3 имеет тип 'size_t *'
Я подозреваю, что это связано с различием в размере указателя, так что на моей 64-битной машине size_t
сглаживается с long int
("%ld"
), тогда как на моей 32-разрядной машине size_t
сглаженный другому типу.
Существует ли спецификатор формата для size_t
?
Ответы
Ответ 1
Да: используйте модификатор длины z
:
size_t size = sizeof(char);
printf("the size is %zu\n", size); // decimal size_t ("u" for unsigned)
printf("the size is %zx\n", size); // hex size_t
Другие доступные модификаторы длины: hh
(для char
), h
(для short
), l
(для long
), ll
(для long long
), j
(для intmax_t
), t
(для ptrdiff_t
) и L
(для long double
). См. §7.19.6.1 (7) стандарта C99.
Ответ 2
Да, есть. Это %zu
(как указано в ANSI C99).
size_t size = 1;
printf("the size is %zu", size);
Обратите внимание, что size_t
не имеет знака, поэтому %ld
является двойным: неправильный модификатор длины и неверный формат преобразования. Если вам интересно, %zd
для ssize_t
(который подписан).
Ответ 3
MSDN, говорит, что Visual Studio поддерживает префикс "я" для переносимого кода на 32 и 64-разрядных платформах.
size_t size = 10;
printf("size is %Iu", size);