Независимо от платформы 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);