Возвращаясь к работе на Си.
Многие из моих функций выглядят так:
int err = do_something(arg1, arg2, arg3, &result);
С намерением результат заполняется функцией, а возвращаемое значение является состоянием вызова.
Темная сторона - это что-то наивное, похожее на это:
int err = func1(...);
if (!err) {
err = func2(...);
if (!err) {
err = func3(...);
}
}
return err;
Я мог бы макрос это, я полагаю:
#define ERR(x) if (!err) { err = (x) }
int err = 0;
ERR(func1(...));
ERR(func2(...));
ERR(func3(...));
return err;
Но это работает, только если я соединяю вызовы функций, а не выполняю другую работу.
Очевидно, в Java, C #, C ++ есть исключения, которые очень хорошо работают для такого рода вещей.
Мне просто любопытно, что другие люди делают и как другие люди в настоящее время обрабатывают ошибки в своих программах на Си.