C: Как вы моделируете «исключение»? - PullRequest
14 голосов
/ 02 августа 2009

Я родом из C #, но сейчас изучаю C. В C #, когда кто-то хочет сообщить, что произошла ошибка, вы бросаете исключение. Но что ты делаешь в C?

Скажем, например, у вас есть стек с функциями push и pop. Как лучше всего сигнализировать, что стек пуст во время pop? Что вы возвращаете из этой функции?

double pop(void)
{
    if(sp > 0)
        return val[--sp];
    else {
        printf("error: stack empty\n");
        return 0.0;
    }
}

Пример K & R со страницы 77 ( код выше ) возвращает 0.0. Но что, если пользователь поместил 0.0 ранее в стек, как вы узнаете, пуст ли стек или было ли возвращено правильное значение?

Ответы [ 12 ]

0 голосов
/ 03 августа 2009

setjmp, longjmp и макросы. Это делалось много раз - самая старая из известных мне реализаций - Эрик Робертс и Марк Вандерворд - mdash; но я использую в настоящее время часть интерфейсов и реализаций Дейва Хансона и свободна от Принстона.

0 голосов
/ 02 августа 2009

Здесь уже есть несколько хороших ответов, просто хотелось бы упомянуть, что что-то похожее на «исключение» может быть сделано с использованием макроса, как это было сделано в удивительном MinUnit (это только возвращает «исключение» для функции вызывающего абонента).

...