Реализация try/catch(...) на Си

Модератор: Модераторы разделов

Аватара пользователя
sergius
Сообщения: 782

Реализация try/catch(...) на Си

Сообщение sergius »

Каким образом лучше всего реализовать такую возможность?
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: Реализация try/catch(...) на Си

Сообщение Zeus »

Взять С++.

А зачем такой геморой?
Спасибо сказали:
Аватара пользователя
sergius
Сообщения: 782

Re: Реализация try/catch(...) на Си

Сообщение sergius »

Zeus писал(а):
03.03.2006 20:17
Взять С++.

Не стоит здесь устраивать что лучше! :boxing:
Zeus писал(а):
03.03.2006 20:17
А зачем такой геморой?

Надо реализовать и все. ;)
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: Реализация try/catch(...) на Си

Сообщение Zeus »

sergius писал(а):
03.03.2006 21:13
Zeus писал(а):
03.03.2006 20:17
Взять С++.

Не стоит здесь устраивать что лучше! :boxing:
Zeus писал(а):
03.03.2006 20:17
А зачем такой геморой?

Надо реализовать и все. ;)

Так почему не взять С++'ный компилятор и юзать его только в части try/catch?
Спасибо сказали:
d_n_k
Сообщения: 636
ОС: Gentoo GNU/Linux

Re: Реализация try/catch(...) на Си

Сообщение d_n_k »

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

можно завести таблицу адресов перехода на обработчики исключений: throw - jump на обработчик(только сперва на секцию finalize, если она была).
все сказанное есть имхо...
Спасибо сказали:
Аватара пользователя
Asgard
Сообщения: 215
Статус: North Valfader

Re: Реализация try/catch(...) на Си

Сообщение Asgard »

реализовывается это довольно просто: man setjmp + man longjmp
sator arepo tenet opera rotas ;)
------------------------------------------------------------
LJ
Спасибо сказали:
Аватара пользователя
flook
Сообщения: 585
Статус: Просто flook

Re: Реализация try/catch(...) на Си

Сообщение flook »

Маньяки :wacko: :wacko: :wacko:
Сишный заменитель try/catch-а (причем в 10 раз более шустрый), котороый обычно пытаются реализовать:

Код: Выделить всё

{
  int err;

  err = do_smth_1();
  if (err)
    goto out;
  err = do_smth_2();
  if (err)
    goto out_rollback1;
  ...
  err = do_smth_N();
  if (err)
    goto out_rollback_N_1;

  err = 0;
out:
  do_finally();
  return err;

out_rollback_N_1:
  rollback_N_1()
out_rollback_N_2:
  rollback_N_2();
...
out_rollback_1;
  rollback_1();
  goto out;
}
В каждом из нас спит гений... и с каждым днем все крепче...
Спасибо сказали: