Какое возвращаемое значение использовать для `read()`?

Я заметил, что несколько раз для проверки возвращаемого значения read() использовался тип int, но при проверке man я заметил, что read() вместо этого возвращает значение типа ssize_t. Я понял, что "вообще" int должен быть больше, чем ssize_t, и поэтому мы не ошибаемся. Но мой вопрос: Есть ли причина использовать int вместо ssize_t? Не лучше ли использовать ssize_t?

Пример кода:

int x;
//ssiz_t x;
x = read(fd, &a, sizeof(a));
if (x == sizeof(a))
    // all is fine
if (x == -1)
    // Error while reading file
if (x == 0)
    // Unexpected end of file

person Robb1    schedule 04.01.2017    source источник
comment
Ввод 3 символов вместо 7? :)   -  person Marian    schedule 04.01.2017
comment
Извини, @Marian, я не понимаю, о чем ты говоришь!   -  person Robb1    schedule 04.01.2017
comment
int — это 3-символьный токен, а ssize_t — 7.   -  person StoryTeller - Unslander Monica    schedule 04.01.2017
comment
int должен быть больше, чем ssize_t, нет, в общем случае это не так, по крайней мере, не в положительном смысле.   -  person alk    schedule 04.01.2017
comment
Разве не лучше использовать ssize_t? Использование точных типов, когда это возможно, действительно является хорошей практикой. И вы должны принять это, когда сможете.   -  person StoryTeller - Unslander Monica    schedule 04.01.2017
comment
О, я лучше поправлю свой вопрос так! ^^' Итак... как хорошо иметь меньше доступных персонажей? Разве всем не следует использовать ssize_t вместо int?   -  person Robb1    schedule 04.01.2017
comment
Не изменяйте свой вопрос после того, как были даны комментарии/ответы, так как это может сделать последние непонятными. Я отредактировал ваш вопрос соответственно.   -  person alk    schedule 04.01.2017
comment
Возможный дубликат Использование ssize_t vs int   -  person bansi    schedule 04.01.2017
comment
К вашему сведению, первый s в ssize_t означает signed. Это размер, который может быть отрицательным. Специальные типы (такие как size_t и ssize_t и многие другие) содержат больше семантической информации. Объявив переменную как ssize_t, вы сообщаете читателю кода, какова цель этой переменной.   -  person Some programmer dude    schedule 04.01.2017


Ответы (2)


Я понял, что "вообще" int должен быть больше, чем ssize_t, и поэтому у нас не возникает ошибки.

Это не правда. Нет абсолютно никаких причин, чтобы это предположение было верным.

есть ли причина использовать int вместо ssize_t? Не лучше ли использовать ssize_t?

Да. Используйте ssize_t для хранения возврата read().

В большинстве ваших случаев использования read() может обрабатывать байты, которые может обрабатывать int. Следовательно, вы, вероятно, никогда не сталкивались с проблемами при использовании int. Но это не причина предпочесть int ssize_t. Всегда используйте правильные типы.

person P.P    schedule 04.01.2017
comment
Спасибо, я отредактировал свой вопрос, удалив неправильное предположение. - person Robb1; 04.01.2017
comment
Но в основном ответ тот же: всегда используйте правильные типы для хранения возвращаемого значения функций, как это задокументировано. Разве не следует всем использовать ssize_t вместо int? - Да, конечно. - person P.P; 04.01.2017

Не лучше ли использовать ssize_t?

Да.

В общем случае используйте любой тип, который функция должна возвращать.


int должно быть больше, чем ssize_t

Нет, в целом нет, по крайней мере, не в положительном плане.

Из документации POSIX:

Тип ssize_t должен поддерживать значения как минимум в диапазоне [-1, {SSIZE_MAX}].

person alk    schedule 04.01.2017