Я пытаюсь изучить C, написав простой анализатор / компилятор. До сих пор это был очень поучительный опыт, однако из-за сильного опыта в C # у меня возникли некоторые проблемы с настройкой - в частности, из-за отсутствия исключений.
Теперь я прочитал Более чистый, более элегантный и труднее распознать , и я согласен с каждым словом в этой статье; В моем коде на C # я стараюсь по возможности не генерировать исключения, однако теперь, когда я столкнулся с миром, в котором я не могу генерировать исключения, моя обработка ошибок полностью затмевает чистую и легкую для чтения логику. моего кода.
В настоящий момент я пишу код, который должен быстро выходить из строя , если есть проблема, а также потенциально глубоко вложен - я остановился на шаблоне обработки ошибок, согласно которому " Функции Get возвращают NULL в случае ошибки, а другие функции возвращают -1
в случае ошибки. В обоих случаях функция, которая терпит неудачу, вызывает NS_SetError ()
, поэтому все, что нужно сделать вызывающей функции, - это очистить и немедленно вернуться в случае сбоя.
Моя проблема заключается в том, что число если (Действие () утверждения, которые у меня есть, делают мне голову - это очень повторяющееся и полностью затемняет лежащую в основе логику. В итоге я создал себе простой макрос, чтобы попытаться улучшить ситуацию, например:
#define NOT_ERROR(X) if ((X) < 0) return -1
int NS_Expression(void)
{
NOT_ERROR(NS_Term());
NOT_ERROR(Emit("MOVE D0, D1\n"));
if (strcmp(current->str, "+") == 0)
{
NOT_ERROR(NS_Add());
}
else if (strcmp(current->str, "-") == 0)
{
NOT_ERROR(NS_Subtract());
}
else
{
NS_SetError("Expected: operator");
return -1;
}
return 0;
}
Каждая из функций NS_Term
, NS_Add
и NS_Subtract
выполните NS_SetError ()
и верните -1
в случае ошибки - его лучше , но все равно кажется, что я злоупотребляю макросами и не » t допускают любую очистку (некоторые функции, в частности функции Get
, которые возвращают указатель, являются более сложными и требуют запуска кода очистки).
В целом кажется, что меня просто не хватает что-то - несмотря на то, что такую обработку ошибок якобы легче распознать, во многих моих функциях я ' m действительно пытается определить, правильно ли обрабатываются ошибки:
NULL
при ошибке при ошибке
NS_SetError ()
, но многие другие функции - нет. Есть ли лучший способ структурировать свои функции, или все остальные тоже есть эта проблема?
Также есть Get
функции (которые возвращают указатель на объект), возвращающие NULL
при ошибке, хорошая идея, или это просто сбивает с толку мою ошибку обработки?