Выброс исключения C ++ через вызов функции C

У меня есть три бесплатных функции: F0, F1 и F2. F0 вызывает F1, который, в свою очередь, вызывает F2.

F0 и F2 - это функции C ++, где F1 - функция C. F2 предоставляется F1 через: extern "C"

Код для каждой из бесплатных функций следующий:

~~~~ F0.cpp ~~~~

void f0()
{
   try
   {
      f1();
   }
   catch (...)
   {}
}

~~~~ F0.cpp ~~~~


~~~~ F1.c ~~~~

void f1()
{
   f2();
}

~~~~ F1.c ~~~~


~~~~ F2.cpp ~~~~

void f2()
{
  throw 1
}

~~~~ F2.cpp ~~~~

Вопрос:

Исключение, выброшенное в f2, прогрессирует через f1 ​​и правильно ли зафиксировано в f0?

Или вызывается std :: неожиданно из-за того, что исключение не обрабатывается, или все это должно быть неопределенным поведением? - если да, то где в стандарте говорится об обработке исключений в этом конкретном контексте.


Обратите внимание, что речь идет не об обработке исключений в C, а о том, что происходит в ситуации, когда исключение может проходить через слой C (если вообще) и быть пойманным на вызывающем слое C ++ - и любых возникающих побочных эффектах и ​​т. Д.


person J Mkdjion    schedule 27.04.2018    source источник
comment
Возможный дубликат Может ли программа C обрабатывать исключения C ++?   -  person Eugene Sh.    schedule 27.04.2018
comment
@EugeneSh. речь идет не об обработке исключений в C, а о том, что происходит в ситуации, когда исключение может протекать через слой C и быть перехвачено вызывающим слоем C ++ - и о любых возникающих побочных эффектах.   -  person J Mkdjion    schedule 27.04.2018
comment
Не может. Поток - значит быть пойманным и повторно брошенным.   -  person Eugene Sh.    schedule 27.04.2018
comment
@EugeneSh. хорошо, если это так, то вызывается ли std :: неожиданно? также правильно ли размотана часть C стека?   -  person J Mkdjion    schedule 27.04.2018
comment
На самом деле я нашел этого кандидата-дубликата SQL. Если это ваш собственный код C, и вы знаете, что он безвреден, я подтверждаю, что вы в порядке, но если ваш код C выделил ресурсы, которые он ожидает освободить при возврате, этого не произойдет. Всегда предполагалось, что функции C ++, нейтральные к исключениям и не имеющие автоматического уничтожения переменных, должны быть такими же эффективными, как и тот же код C, но это не значит, что он идентичен.   -  person Gem Taylor    schedule 27.04.2018
comment
Думаю, ваш вопрос - это реализованное поведение. Вы должны указать свой компилятор, свою систему и т. Д. Но я не понимаю, почему и как код c может вызывать функцию c ++.   -  person Stargateur    schedule 27.04.2018
comment
@GemTaylor, это в значительной степени сценарий, с которым я столкнулся, и надеялся, что будет объяснение, которое применимо в целом и, надеюсь, не определено реализацией, хотя большинство ответов на этот вопрос, похоже, не достигают консенсуса.   -  person J Mkdjion    schedule 27.04.2018
comment
Вас интересует ответ языкового юриста, а точнее, что происходит? Если второе, почему бы просто не скомпилировать его и посмотреть, что произойдет?   -  person C Johnson    schedule 27.04.2018
comment
Извините, но что такое throw 1?   -  person Paul    schedule 17.01.2020


Ответы (1)


Это вопрос, связанный с платформой и компилятором.

Например, в Linux / GCC вы должны скомпилировать код C с параметром -fexceptions, тогда будут построены таблицы очистки, а исключение будет выдавать код C.

Из https://gcc.gnu.org/onlinedocs/gcc-7.3.0/gcc/Code-Gen-Options.html#index-fexceptions

-fexceptions

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

Я менее знаком с разработкой Visual C ++ / Windows, но считаю, что обработка исключений будет использовать общие механизмы, если вы скомпилируете свой код C ++ и C с параметром / EHa (разрешить сочетание исключений структурированных и C ++)

person Severin Pappadeux    schedule 27.04.2018