Независимые от платформы спецификаторы формата size_t в c?
-
22-09-2019 - |
Вопрос
Я хочу распечатать переменную типа 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);