Некоторые среды поддерживают это более или менее напрямую.
Например, если вы включите структурированную обработку исключений и C ++ с помощью переключателя компилятора /EH
,Вы можете реализовать исключения C ++ поверх структурированной обработки исключений Microsoft («исключения» для C).При условии, что эти опции установлены при компиляции всего вашего кода (C ++ на каждом конце и C в середине), раскручивание стека будет «работать».
Однако, это почти всегда плохая идея (TM)). Почему, спросите вы?Учтите, что фрагмент кода C в середине:
WaitForSingleObject(mutex, ...);
invoke_cxx_callback(...);
ReleaseMutex(mutex);
И что invoke_cxx_callback()
(.... барабанная дробь ...) вызывает ваш код C ++, который выдает исключение.Вы будете пропускать блокировку мьютекса.Ой.
Видите ли, дело в том, что большая часть кода C не написана для обработки раскручивания стека в стиле C ++ в любой момент при выполнении функции.Более того, в нем отсутствуют деструкторы, поэтому у него нет RAII для защиты от исключений.
Kenny TM имеет решение для C ++ 11 и Boost-основанные проекты. xxbbcc имеет более общее, хотя и более утомительное решение для общего случая.