Допустим, у меня есть разделяемая библиотека, которая реализована на C++, но предоставляет чистый c-интерфейс. Эта библиотека затем используется в c-программе.Поведение исключений C++ escaping в c-программу
Предоставляет ли gcc какие-либо гарантии о том, что происходит, если исключение выходит из библиотеки C++ в приложение c?
Будет ли это, например. всегда заканчивать программу?
Меня больше всего интересует ответ gcc на Linux на x64 и ARMv7-R, но ответы на другие операционные системы, компиляторы и архитектуры также приветствуются.
EDIT:
Просто сделать это ясно: я не говорю о разрешении исключения проходят через с-функции, а затем быть пойманы в вызывающей функции C++ или взаимодействия с С или С ++ обратных вызовов. Сам код приложения является чистым c. В какой-то момент он будет вызывать функцию общей библиотеки (которая внутренне является чистым C++), и код приложения не будет вызываться до тех пор, пока эта функция не вернется. Также предположим, что я не могу контролировать, какие флаги используются для компиляции кода приложения.
I_believe_, что такое исключение будет рассматриваться как неперехваченное исключение (т. Е. Генерирует вызов на 'std :: terminate'), если код C не скомпилирован с' -fexceptions', и в этом случае исключение может распространяться (хотя может все еще быть невостребован). Однако у меня нет поддающегося проверке источника. – davmac
Это одна из причин, почему, если вы смешиваете C и C++, общая директива заключается в том, что 'main()' компилируется как C++, а не как C, а функции 'extern 'C' 'ломают исключения и не позволяют им распространяться вызывающему абоненту. Либо это, либо код C++ скомпилирован без поддержки или вообще не бросается. Распространение исключения C++ с помощью функции C не определено. – Peter
@Peter: Да, я не доволен ситуацией, но это то, что есть. Библиотека используется c-программами - я не могу ее изменить. Если я забыл уловить какое-то исключение при завершении пограничной программы, то - вообще - приемлемо для меня (в частности, я обычно не пытаюсь восстановить из «bad_alloc»), но я не хочу рисковать неопределенным поведением. Таким образом, вопрос, с которым я столкнулся, заключается в том, что я должен включить реализацию всех функций интерфейса в дополнительный 'try {...} catch (...) {std :: terminate(); } ', чтобы быть в безопасности, или я могу полагаться на компилятор для получения того же эффекта. – MikeMB