10 ответов:
можно использовать
zдля size_t иtдля ptrdiff_t, так как вprintf("%zu %zd", size, ptrdiff);но мой manpage говорит, что некоторые старые библиотеки использовали другой символ, чем
zи препятствует его использованию. Тем не менее, он стандартизирован (по стандарту C99). Для техintmax_tиint8_tнаstdint.hи так далее, есть макросы, которые вы можете использовать, как и другой ответ сказал:printf("value: %" PRId32, some_int32_t); printf("value: %" PRIu16, some_uint16_t);они перечислены в справочной странице о
inttypes.h.лично я бы просто приведите значения к
unsigned longилиlongкак другой ответ рекомендует. Если вы используете C99, то вы можете (и должны, конечно) привести кunsigned long longилиlong longи с помощью%lluили%lldформаты соответственно.
печати
off_t:printf("%jd\n", (intmax_t)x);печати
size_t:printf("%zu\n", x);печати
ssize_t:printf("%zd\n", x);см. 7.19.6.1 / 7 в стандарте C99 или более удобной документации POSIX по кодам форматирования:
http://pubs.opengroup.org/onlinepubs/009695399/functions/fprintf.html
если ваша реализация не поддерживает эти коды форматирования (например, потому что вы находитесь на C89), то у вас есть немного проблема, так как AFAIK нет целочисленных типов в C89, которые имеют коды форматирования и гарантированно будут такими же большими, как эти типы. Поэтому вам нужно сделать что-то конкретное для реализации.
например, если ваш компилятор имеет
long longи ваша стандартная библиотека поддерживает%lld, вы можете с уверенностью ожидать, что будет служить вместоintmax_t. Но если это не так, вам придется вернуться кlong, который потерпел бы неудачу в некоторых других реализациях, потому что это слишком маленький.
для Microsoft, ответ отличается. VS2013 в основном соответствует C99, но " [t]he HH, J, z и T префиксы длины не поддерживаются."Для реализация "то есть unsigned __int32 на 32-разрядных платформах, unsigned __int64 на 64-разрядных платформах" используйте префикс I (capital eye) со спецификатором типа o, u, x или X. см. VS2013 спецификация размера
Что касается off_t, то он определяется как long в VC\include\sys\types.з.
какую версию C вы используете?
в C90 стандартная практика заключается в приведении к подписанному или неподписанному длинному, в зависимости от обстоятельств, и печати соответственно. Я видел %z для size_t, но Харбисон и Стил не упоминают об этом в printf (), и в любом случае это не поможет вам с ptrdiff_t или чем-то еще.
в C99 различные типы _t поставляются со своими собственными макросами printf, поэтому что-то вроде
"Size is " FOO " bytes."Я не знаю подробностей, но это часть довольно большого числовом формате файл.
вы хотите использовать макросы форматирования из inttypes.з.
см. Этот вопрос: кросс-платформенная строка формата для переменных типа size_t?
смотрим
man 3 printfна Linux, OS X и OpenBSD все показывают поддержку%zнаsize_tи%tнаptrdiff_t(для C99), но ни один из них не упоминаетoff_t. Предложения в дикой природе обычно предлагают до%uпреобразованиеoff_t, что является "достаточно правильным", насколько я могу судить (обаunsigned intиoff_tразличаются одинаково между 64-разрядными и 32-разрядными системами).
Я видел этот пост, по крайней мере дважды, потому что принято отвечать трудно, помню, для меня(я редко использую
zилиjфлаги и они, кажется, не независимая платформа).The стандартный никогда не говорит четко точную длину данных
size_t, поэтому я предлагаю вам сначала проверить длинуsize_tна вашей платформе, то выбрать один из них:if sizeof(size_t) == 4 use PRIu32 if sizeof(size_t) == 8 use PRIu64и
stdintтипы, а не типы исходных данных для консистенция.
насколько я помню, единственный портативный способ сделать это - привести результат к "unsigned long int" и использовать
%lu.printf("sizeof(int) = %lu", (unsigned long) sizeof(int));
Comments