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

141
задан hippietrail 4 April 2011 в 10:53
поделиться

6 ответов

Можно использовать z для size_t и t для ptrdiff_t как в [1 115]

printf("%zu %td", size, ptrdiff);

, Но в моей странице справочника говорится, что некоторая более старая библиотека использовала другой символ, чем 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, то Вы можете (и если, конечно) бросок к [1 111] или long long, и используйте %llu или %lld форматы соответственно.

105
ответ дан Johannes Schaub - litb 4 April 2011 в 10:53
поделиться

Какую версию C Вы используете?

В C90, общепринятая практика состоит в том, чтобы бросить к со знаком или длинному неподписанному, как соответствующая, и печать соответственно. Я видел %z для size_t, но Harbison и Steele не упоминают это под printf (), и в любом случае который не помог бы Вам с ptrdiff_t или что бы то ни было.

В C99, различные типы _t идут со своими собственными printf макросами, таким образом, что-то как "Size is " FOO " bytes." я не знаю детали, но это - часть довольно большого числового формата, включают файл.

3
ответ дан David Thornley 4 April 2011 в 10:53
поделиться
  • 1
    Вызов AsQueryavle won' t изменение это вообще. Это должен быть соответствующий источник данных для содержания на той ссылке на справку; LINQ к Объектам является все еще LINQ к объектам, скрываясь позади IQueryable – Marc Gravell♦ 8 October 2010 в 21:51

Вы захотите использовать макросы форматирования от inttypes.h.

Посмотрите этот вопрос: строка Кросс-платформенного формата для переменных типа size_t?

3
ответ дан Community 4 April 2011 в 10:53
поделиться
  • 1
    @Marc: Не верный. Методы IQueryable не оценивают, пока они не имеют к, независимо от первоисточника. Что-либо объединенное в цепочку к AsQueryable (), который просто выкладывает другой IQueryable, в основном сделало не что иное как добавило узел к дереву выражений. Теперь при прикреплении ToList () на конце дерево сразу оценено прямо после it' s созданный; это имеет к, чтобы дать Вам результат, Вы сказали, что Вам нужно прямо сейчас. That' s все Вы; Вы могли, в зависимости от ситуации, на самом деле использовать задержанное выполнение путем ожидания, пока Вам не нужен Список для вызова IQueryable. ToList (). – KeithS 8 October 2010 в 22:03

Как я вспоминаю, единственный портативный способ сделать это, должен бросить результат к "неподписанному длинному целому" и использованию %lu.

printf("sizeof(int) = %lu", (unsigned long) sizeof(int));
-4
ответ дан Alex B 4 April 2011 в 10:53
поделиться
  • 1
    Похож я был неправ... каждый день изучают что-то новое. – Babak Naffas 8 October 2010 в 22:59

Смотря 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-разрядными системами).

1
ответ дан dwc 4 April 2011 в 10:53
поделиться
  • 1
    @Keith все, что Вы говорите, там относится к " итератор blocks" также. Большинство LINQ к объектам использует блоки итератора (возврат урожая). – Marc Gravell♦ 8 October 2010 в 22:05

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

-9
ответ дан 23 November 2019 в 23:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: