Очень часто я вижу в коде C отрицание возвращенных кодов ошибок, например return -EINVAL
вместо return EINVAL
. Почему используется отрицание?
На многих UNIXen, соглашение для системных вызовов заключается в том, что они возвращают код ошибки, аннулированный в случае ошибки, и фактическое значение в случае успеха.
Это переводится на стороне пользователя в пространство -1
для ошибок с положительным кодом ошибки errno
или фактическим значением в случае успеха.
Необходимость такого двойного назначения возвращаемого значения заключается в том, что множественные возвраты в этом языке являются утомительными, так как вам придется прибегнуть к передаче out-параметров для удержания возможной ошибки.
Это соглашение; многие функции возвращают строго положительный результат в случае успеха и отрицательный результат в случае неудачи. Первоначально это было связано с кодом возврата процесса Unix. Успех был обозначен 0.