Вопрос

Я хочу распечатать переменную типа 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 имеет псевдоним a long int ("%ld"), тогда как на моей 32-разрядной машине size_t имеет псевдоним другого типа.

Существует ли спецификатор формата специально для size_t?

Это было полезно?

Решение

ДА:используйте 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.

Другие советы

Да, это так.Это так %zu (как указано в ANSI C99).

size_t size = 1;
printf("the size is %zu", size);

Обратите внимание , что size_t является неподписанным, таким образом %ld это вдвойне неправильно:неправильный модификатор длины и неправильный спецификатор преобразования формата.На случай, если вам интересно, %zd является для ssize_t (который подписан).

MSDN, говорит, что Visual Studio поддерживает префикс "I" для переносимого кода на 32- и 64-разрядных платформах.

size_t size = 10;
printf("size is %Iu", size);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top