Как я должен печатать такие типы, как off t и size t?



Я пытаюсь печатать такие типы, как off_t и size_t. Что такое правильный заполнитель для printf()Это портативный?



или есть совершенно другой способ печати этих переменных?

683   10  

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));

пожалуйста, используйте %lu. Off_t не имеет знака long.

используйте "%zo " для off_t. (восьмеричный) или" %zu " для десятичного числа.

Comments

    Ничего не найдено.