Я хочу распечатать переменную типа 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
?
c
platform-independent
size-t
format-string
format-specifiers
Итан Хейлман
источник
источник
&
куда-то убирали ?warning: format '%ld' expects type 'long int *', but argument 3 has type 'size_t *'
когда, вероятно, следует говоритьwarning: format '%ld' expects type 'long int', but argument 3 has type 'size_t'
. Вы, возможно, использовалиscanf()
вместо этого, когда получили эти предупреждения?Ответы:
Да: используйте
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.источник
size_t
и anssize_t
; последний используется редко.%zu
, потому что аргумент беззнаковый.z
модификатор длины не является частью C89 / C90. Если вы нацелены на код, совместимый с C89, лучшее, что вы можете сделать, это привестиunsigned long
и использоватьl
вместо него модификатор длины, напримерprintf("the size is %lu\n", (unsigned long)size);
; поддержка как C89, так и систем сsize_t
большим, чемlong
более сложна и потребует использования ряда макросов препроцессора.Да, есть. Это
%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);
источник