Подтвердить что ты не робот

Что произойдет, если исключение получит "через" c-код?

Возможный дубликат:
Будут ли исключения С++ безопасно распространяться через C-код?

Если у вас есть c-код, например png lib, с вашими собственными обработчиками io, которые написаны на С++, и исключение получает из-за некоторой ошибки io. нормально ли это пройти через код c и поймать его вне кода c? я знаю, что следует соблюдать осторожность при утечке памяти, но обычно все структуры получают предварительное выделение.

4b9b3361

Ответ 1

Это полностью зависит от компилятора, если это будет работать или нет. Ни один из языковых стандартов, очевидно, не может сказать ничего о том, что должен делать другой язык.

В лучшем случае исключение передаст код C и вернется к следующему уровню С++, возможно, утечка любых динамически распределенных структур C. В менее хорошем случае он сработает и сгорит!

Можно, конечно, скомпилировать C-код как С++, а также проверить, что он является нейтральным.

Ответ 2

Ответ на ваш вопрос определяется реализацией.

Для GCC, как говорит @Kerrek, компиляция кода C с помощью -fexceptions гарантирует, что время выполнения остается непротиворечивым, когда исключение генерируется через код C. (Обратите внимание, что современные механизмы исключений реализуются не только через setjmp/longjmp, они фактически разматывают кадр за кадром, чтобы обрабатывать деструкторы и правильно пытаться/блокировать блоки.)

Однако сам C-код не может ожидать наличия исключений. Много кода C написано так:

acquire a resource
do some stuff
release resource

Здесь "получить ресурс" может означать malloc, или pthread_mutex_lock, или fopen. Если ваш код на С++ является частью "делать некоторые вещи", и он генерирует исключение, хорошо... Упс.

Утечки ресурсов - это не единственная проблема; так что правильность является общей. Представьте себе:

subtract $100 from savings account
add $100 to checking account

Теперь представьте, что исключение будет выбрано после завершения первого шага, но до второго.

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

Ответ 3

Это нормально для вашего кода на С++, если это:

  • Скомпилировано с включенными исключениями.
  • Безопасное исключение.

Это нормально для вашего кода C или С++, если:

  • Никакие ресурсы не должны собираться явно между бросанием исключения и его уловом.

Код, скомпилированный с поддержкой исключений на языке С++, добавляет специальные крючки для очистки, когда исключения выбрасываются и не попадают в эту область. Объекты С++, выделенные в стеке, будут вызывать их деструкторы.

Единственный ресурс, восстановленный в C (или С++ без поддержки исключений), когда генерируется исключение, - это пространство, выделенное в каждом стеке стека.

Этот раздел руководства GCC весьма полезен:

       -fexceptions
           Enable exception handling.  Generates extra code needed to
           propagate exceptions.  For some targets, this implies GCC will
           generate frame unwind information for all functions, which can
           produce significant data size overhead, although it does not affect
           execution.  If you do not specify this option, GCC will enable it
           by default for languages like C++ which normally require exception
           handling, and disable it for languages like C that do not normally
           require it.  However, you may need to enable this option when
           compiling C code that needs to interoperate properly with exception
           handlers written in C++.  You may also wish to disable this option
           if you are compiling older C++ programs that don't use exception
           handling.

Ответ 4

Исключения обычно не забрасываются "через" код; как следует из действия, они вызывают "над" кодом.

В качестве предпосылки; по крайней мере, старые школьные исключения Objective-C обычно реализуются с помощью setjmp и longjmp; по существу сохраняя адреса кода для последующего использования.

Имеет смысл, если исключения С++ будут реализованы с помощью аналогичных механизмов; и как таковой; тип кода, за исключением которого "исключается", или, точнее, "более", мало что имеет, если вообще. Можно даже представить себе настройку, в которой исключение Objective-C выбрасывается над С++ catch или наоборот.

Изменить: Как упоминает Бо Перссон; это не означает, что исключение С++, исключающее C-код, не приведет к хаосу и утечкам; но исключения, которые бросают, обычно являются плохими вещами во всем мире; так что это вряд ли имеет большое значение.

PS: Претензии на самом деле задают вопрос, где используются теги C и С++.;)

Ответ 5

C ничего не знает об исключениях, поэтому невозможно сказать, что произойдет.

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