Возвращаясь к работе с C.
Многие из моих функций выглядят так:
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 в наши дни.