Если Size_t
совпадает с size_t
, то %zu
является правильным.
STRLEN
вероятно, но не обязательно, совпадает с size_t
.
Если SSize_t
совпадает с ssize_t
, то %zd
является , вероятно правильным (это сложно).
Для других типов, если вы не знаете, что Предопределенный тип, которому они соответствуют, конвертируют в известный тип. Знание подписи помогает. Например:
some_unknown_signed_integer_type n = 42;
some_unknown_unsigned_integer_type x = 128;
printf("n = %jd\n", (intmax_t)n);
printf("x = %ju\n", (uintmax_t)x);
intmax_t
и uintmax_t
определены в <stdint.h>
.
Вы можете обойтись без преобразования в long
или unsigned long
и использования %ld
или %lu
, например, если вы знаете, что тип не шире, чем long
или unsigned long
.