Ответ 1
Из того, что я вижу о исключениях С++, в этот пример, который я принял из MSDN, GCC, похоже, включает следующую сборку в выводе:
call __cxa_end_catch
jmp .L37
movq %rax, %rbx
call __cxa_end_catch
movq %rbx, %rax
movq %rax, %rdi
call _Unwind_Resume
Использует то, что я могу только предположить, - это вызов библиотеки С++ для функций, которые имеют дело с исключениями (например, _Unwind_resume
). Поэтому, если код C ссылается на вашу библиотеку, он должен будет предоставить эти символы/функции, что означает, что код будет вводить библиотеку С++ для устранения исключений.
Однако я еще не знаю, что требует библиотека С++ для выполнения своей работы. Я ожидал бы, что это будет самодостаточным, но я не уверен в этом.
Изменить: ответ на этот вопрос, вероятно, заключается в ответах на следующие два существующих вопроса (и их интерпретация):
- Как реализована среда выполнения обработки исключений С++?
- Как выполняются исключения под капотом?
- Как работают исключения (за кулисами) в С++
Изменить 2: Из этого ответа, кажется, что, поскольку __cxa_throw
использует таблицу для отслеживания доступных обработчиков. Я бы предположил, что когда таблица исчерпана, что в нашем случае происходит, когда мы вводим код C, функция вызывала бы std::terminate
. Следовательно, среда выполнения С++ (на которую вы должны были связать) должна позаботиться об этом для вас, если вам не нужно поставить предложение catch all.
Поскольку я все еще не уверен, я напишу тест этой теории и обновить ответ с результатами.