Как мне печатать такие типы, как off_t и size_t?

Чтобы напечатать off_t:

printf("%jd\n", (intmax_t)x);

Чтобы напечатать portable size_t:

printf("%zu\n", x);

Чтобы напечатать ssize_t:

printf("%zd\n", x);

См. 7.19.6.1/7 portability в стандарте C99 или более portability удобную документацию POSIX format-specifiers по кодам форматирования:

http://pubs.opengroup.org/onlinepubs/009695399/functions/fprintf.html

Если portability ваша реализация не поддерживает c эти коды форматирования (например, потому portability что вы используете C89), тогда format-string у вас есть небольшая проблема, поскольку format-string AFAIK нет целочисленных типов format-specifiers в C89, которые имеют коды format-specifiers форматирования и гарантированно format-specifiers быть такими же большими, как format-specifiers эти типы. Итак, вам нужно portable сделать что-то зависящее format-specifiers от реализации.

Например, если format-string ваш компилятор имеет long long, а format-string ваша стандартная библиотека format-string поддерживает %lld, вы можете portable с уверенностью ожидать, что c он будет служить вместо intmax_t. Но portable если этого не произойдет, вам c придется вернуться к long, что portable приведет к сбою в некоторых c других реализациях, потому portable что он слишком мал.

c

portability

format-specifiers

2022-10-28T10:47:50+00:00