Каков наилучший способ вернуть ошибку функции, когда я уже возвращаю значение?
Некоторые дополнительные мысли к различным ответам.
Вернуть структуру
Код может возвращать значение и код ошибки. Беспокойство вызывает распространение типов.
typedef struct {
int value;
int error;
} int_error;
int_error intval(const char *string);
...
int_error = intval(some_string);
if (int_error.error) {
Process_Error();
}
int only_care_about_value = intval(some_string).value;
int only_care_about_error = intval(some_string).error;
Не число и NULL
Использовать специальное значение, когда тип возврата функции предоставляет его.
Номера C не требуются, но вездесущи.
#include <math.h>
#include <stddef.h>
double y = foo(x);
if (isnan(y)) {
Process_Error();
}
void *ptr = bar(x);
if (ptr == NULL) {
Process_Error();
}
_Generic
/ Перегрузка функций
Учитывая плюсы и минусы error_t foo(&dest, x)
против dest_t foo(x, &error)
,
При каскадном использовании _Generic
или перегрузке функций в качестве расширения компилятора при выборе двух или более типов имеет смысл дифференцировать основную функцию, вызываемую на основе параметров вызова, а не возвращаемого значения. Вернуть общий тип, статус ошибки.
Пример: функция error_t narrow(destination_t *, source_t)
, которая преобразует значение одного типа в более узкий тип, например long long
в short
, и проверяет, находится ли исходное значение в диапазоне цели тип .
long long ll = ...;
int i;
char ch;
error = narrow(&i, ll);
...
error = narrow(&ch, i);