LINUX.ORG.RU

[СИ] Как задать off_t константу.

 


0

1

[СИ] Как задать off_t константу.

Язык СИ
ОС UNIX

Как задать off_t константу
off_t offmax=0x7FFFFFFFFFFFFFFF;
Компилятор не принимает.
Пробовал так:

off_t k1, k2;
k1=0x7FFFFFFF;
k2=0xFFFFFFFF;
offmax=((k1<<32)& (~k2)) + k2;

Получилось.
А можно ли компактнее и вернее?
Примерно так
offmax=OFFMAX;
какая уж есть в действительности - 32 или 64.

Кто знает прошу ответить.


Это потому, что константа по умолчанию как int воспринимается. Укажите явно, что это long long:

off_t offmax=0x7FFFFFFFFFFFFFFFLL;
И, естественно, если система 32-битная, надо константы указать:
#define _LARGEFILE64_SOURCE
#define _FILE_OFFSET_BITS 64
Для типа off64_t хватит
#define _LARGEFILE64_SOURCE

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

Eddy_Em
Спасибо.
Помогли эти LL.
А define-ы не влияют.
Еще вопрос:
Можно ли обойтись совсем без define-ов?
Где sizeof(off_t)==4, там я другую константу задам, поменьше.
Это желательно для универсальности функций.

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

Только что заметил тип off64_t. Где его применять?
Ведь функции lseek(), stat() всё равно дают тип off_t.

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

По умолчанию off_t и есть 32-х-битная константа, a la uint32_t. А дефайны делают ее 64-х-битной (это нужно для работы с большими файлами - я с этим как-то раз столкнулся, долго долбал себе мозг, пока не прочитал маны).

Так что, если у вас не 64-х-битная система, без этих дефайнов не обойтись.

Eddy_Em ☆☆☆☆☆
()

> Язык СИ

какой именно? с89 или с99? в стандартном с89 больше long не бывает, для которого суффикс константы — L (например, 0x12345678L). в с99 есть тип, который может быть больше long — long long (суффикс константы — LL), но максимальным следует считать тип intmax_t, и константа для него задается макросом INTMAX_C(value), например INTMAX_C(0x12345678) (в зависимости от платформы может развернуться в 0x12345678, 0x12345678L или 0x12345678LL).

т.к. для off_t нет макроса константы, то лучше всего задавать константу максимального типа и кастовать к off_t, например «off_t offset = (off_t) 0x12345678L;» или «off_t offset = (off_t) INTMAX_C(0x12345678);». как-то так :)

arsi ★★★★★
()

> А можно ли компактнее и вернее?

Компактнее вряд ли, но «вернее» можно - вычислить максимальное положительное значение off_t.


((k1<<32)& (~k2)) + k2


Это еще что за белиберда?

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

> лучше всего задавать константу максимального типа и кастовать к off_t

И если INTOFF_MAX < INTMAX_MAX , что мы получим? ;)

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

Спасибо.
Не пробовал еще. Догадываюсь, что файл <stdint.h>.
Си тот, в котором есть long long. Но это не навсегда. Несколько машин.
Они могут быть разные. Но все UNIX.

Верно ли я понимаю, что константы можно просто вычислить заранее, и применять
потом зная только sizeof(off_t), и обойтись вовсе без макросов?

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

Сразу бы и писали, что фряха. Может, какие-нибудь BSD'идсты быстрее подсказали...

// сам понятия не имею, есть ли во фряхе типы off64_t и всякие макросы вроде _FILE_OFFSET_BITS

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от oleg_2

из манов линукса
http://www.opennet.ru/man.shtml?topic=getline&category=3&russian=0
заглушка

ssize_t getline(char **lineptr, size_t *n, FILE *stream)

{
   return(0);
}

warning: passing argument 2 of 'getline' from incompatible pointer type

У меня нет такой функции.

Других ошибок пока нет.

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

ssize_t getline(char **lineptr, off_t *n, FILE *stream)

{
   return(0);
}

с такой заглушкой компилит.

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