LINUX.ORG.RU

fpos_t & printf


0

0

Подскажите как без warningов и корректно отprintfить переменную с типом fpos_t ?
для size_t вычитал что есть модификатор %z, т.е
printf("%zu",size_t_value);
работает корректно.
А про fpos_t удалось найти только такую вещь:

#ifdef _EXTENDED_FILE_OFFSETS
printf("%Ld", fpos_t_offset);
#else
printf("%d", fpos_t_offset);
#endif

Не знаю насколько _EXTENDED_FILE_OFFSETS применимо к linuxу - все равно с -Wall ругается ;(

anonymous

в принципе printf декларирован как

int printf( const char *, ... );

поэтому имхо даже если ты напишешь printf( 0, 10 ); то это не нарушает стандарт. А -Wall может себе ругаться сколько хочет. Он на такое тоже ругается:

if ( a = b ) { ... }

Если серьезно то ведь fpos_t обязан быть целочисленным типом (ну правда ведь??), а по стандарту ничего длиннее long long нет. (Поправьте меня). Поэтому помоему абсолютно нормальный и правильный способ:

printf( "%llu", (unsigned long long)value );

dilmah ★★★★★
()
Ответ на: комментарий от dilmah

Спасибо за ответ, так и сделаю тогда.
Просто хочется чтоб -Wall заткнулся наконец, обидно когда из-за printf'a единственный warning :)

anonymous
()
Ответ на: комментарий от anonymous

Не совсем так. Во-первых, fpos_t *не обязан быть целочисленным типом* Вообще по-стандарту единственное, что можно делать с fpos_t -- это передавать его fsetpos (ну, не считая присваиваний там и т. п. ;) В силу этого стандартного способа напечатать его printf -- нет. В системах, где нет long long, кстати (а их довольно много) fpos_t почти наверняка будет реализован не как целочисленный тип. Далее, даже в C99 long long -- это не обязательно самый большой тип. Стандарт допускает произвольное количесство дополнительных типов, но самый большой должен быть typedef'ed как intmax_t в stdint.h и через printf он должен печататься как %jd Но, повторюсь, нет никакой гарантии, что fpos_t может быть приведен к intmax_t даже если это 1024-битный тип :)

anonymous
()
Ответ на: комментарий от anonymous

Большое спасибо за ответы. Все-таки не удается этот fpos_t победить, ну и хрен с ним раз он не стандартный такой весь. :)
Хотя под DJGPP(http://www.delorie.com/djgpp/) досявый у меня fpos с радостью печатается как unsigned long int. :)

anonymous
()

Нет, товарищ глубоко заблуждается. fpos_t совершенно стандартный. Просто он как раз был придуман для тех случаев, когда размер файла не может быть выражен никаким целочисленным типом. Что в случае C90 где 64-битного типа может и не быть -- ситуация совершенно реальная

aa5779
()

2aa5779 (*) (2002-07-24 16:06:21.508) контекст вопроса то в чем -- как fpos_t визуализировать. И утверждение о нестандартности делалось именно в этом контексте -- стандартного способа визуализировать нет. Ничего нового в этом контексте тобой не сказано.

dilmah ★★★★★
()

Как визуализировать? Пожалуйста: fpos_t some_val; int i; for(i = 0; i < sizeof(some_val); i++) printf("%2.2X", ((unsigned char *)&some_val)[i]);

aa5779
()

Как визуализировать? Пожалуйста: fpos_t some_val; int i; for(i = 0; i < sizeof(some_val); i++) printf("%2.2X", ((unsigned char *)&some_val)[i]); все совершенно по стандарту (ну, можно еще использовать не каст к char *, а создать отдельный буфер и в него скопировать значение memcpy, хотя думаю я что на 99% архитектур кастинг к char * надежен)

aa5779
()

(1) я не думаю что тот кто задавал этот вопрос хотел этого.

(2) ваше решение некорректно и опять же непортабельно -- fpos_t может быть структурой с дырками, а дырки иметь mutable content.

dilmah ★★★★★
()
Ответ на: комментарий от dilmah

Ничего подобного. Данный код делает именно то, что требуется: выводит значение типа fpos_t. Как он это делает и что потом можно с результатом сделать -- это уже другой вопрос. Мне интересно, как вообще хоть что-то можно сделать переносимое с файловыми указателями, кроме ftell/fseek, fgetpos/fsetpos. Стандарт С ничего больше не гарантирует. И дырки тут совершенно ни при чем.

aa5779
()
Ответ на: комментарий от aa5779

2aa5779 (*) (2002-07-26 13:48:09.605):
> Данный код делает именно то, что требуется: выводит значение типа fpos_t.
> ...И дырки тут совершенно ни при чем.
Дык, он может "озвучить" два ОДИНАКОВЫХ значения переменной по-разному!

Пример из жизни: выведи таким образом сегментированные ДОСовские указатели.

Die-Hard ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.