59

Я хочу распечатать переменную типа size_t в C, но оказывается, что size_t псевдонимы разных типов переменных на разных архитектурах. Например, на одном компьютере (64-разрядная версия) следующий код не бросает никаких предупреждений:Независимая от платформы size_t Спецификаторы формата в c?

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

но на моей другой машине (32-разрядная версия) выше код выдает следующее предупреждение:

предупреждение: формат «% л.д.» ожидает типа «длинный ИНТ *», но аргумент 3 имеет тип «size_t *»

Я подозреваю, что это из-за разницы в размере указателя, так что на мой 64-разрядная машина size_t имеет псевдоним long int ("%ld"), тогда как на моей 32-разрядной машине size_t сшивается другим типом.

Есть ли спецификатор формата для size_t?

+0

Ваше предупреждающее сообщение не соответствует коду. Предупреждение указывает указатели, ваш код не имеет. Вы удалили какой-нибудь «&» где-нибудь? – Jens

+0

Указатели? Нет. Я не получаю никаких предупреждений о указателях, ведь в зависимости от того, на какой машине я запускаю этот код, иногда я не получаю никаких предупреждений. Попробуйте следующий испытательный код: #include int main() { size_t size = 1; printf («размер% ld», размер); return 0; } –

+1

См. Также [Кросс-платформенная форма для переменных типа size_t?] (Http://stackoverflow.com/questions/174612/cross-platform-format-string-for-variables-of-type-size-t) , – legoscia

ответ

87

Да: использовать z длину модификатор:

size_t size = sizeof(char); 
printf("the size is %zd\n", size); // decimal size_t 
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.

+0

В чем разница между zd и zu? Я получаю, что zd является десятичным, но подписывается, если да, то как zd подписывается. –

+1

Это разница между 'size_t' и' ssize_t'; последнее редко используется. –

+20

Правильно, поэтому в этом случае вы должны использовать '% zu', потому что аргумент неподписан. – caf

25

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

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

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

0

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

size_t size = 10; 
printf("size is %Iu", size); 
+3

это специфичный MS, который не является стандартным, поэтому он не является независимым от платформы –

Смежные вопросы