Независимый от платформы size_t Спецификаторы формата в c? - PullRequest
70 голосов
/ 24 января 2010

Я хочу распечатать переменную типа 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?

Ответы [ 3 ]

103 голосов
/ 24 января 2010

Да: используйте модификатор длины 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.

35 голосов
/ 01 марта 2014

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

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

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

0 голосов
/ 14 октября 2015

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

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