У меня есть функции C ++, которые я хочу объявить, используя extern "C"
даже если они вызываются только в коде C ++. Да, я знаю, что это странно, но я хотел бы сделать это для согласованности, поскольку мы смешали объявления C и C ++. Я просто хочу убедиться, что объявление функции C ++ как extern "C"
не повлияет на поведение броска.
Это будет выглядеть примерно так:
extern "C" void foo() {throw exception;}
int bar()
{
try
{
foo();
} catch (exception e) { return 1; }
}
Msgstr «Могут ли функции C ++, помеченные как Extern» C «, генерировать?»
да, в том смысле, что ни язык, ни компилятор не помешают вам сделать это.
нет, в том смысле, что если вы бросите, это будет неопределенное поведение, так как исключение C ++ пересекает языковые границы.
На практике: не делай этого. Поймайте исключение и переведите его в код ошибки или средство, понятное другому языку.
Итак, итоги: не делайте выбросить исключение из функций, помеченных как extern "C"
,
За GCC ответ кажется неубедительным.
Документация MSVC, однако относительно ясно по этому вопросу:
/EHa
а также /EHs
… говорит компилятору предположить, что функции, объявленные как extern «C», могут вызвать исключение./EHsc
… говорит компилятору предположить, что функции, объявленные как extern «C», никогда не выдают исключение C ++ Так что для Visual-C ++ это зависит от параметров компилятора, получите ли вы определенное поведение.
он будет скомпилирован, но это не определенное поведение для выброса из функции, помеченной как связанная с Си. C не имеет исключений, поэтому в общем случае вы должны просто вернуть код ошибки и / или предоставить функцию, которая возвращает информацию о последней ошибке.
#include <exception>
extern "C" void foo() {throw std::exception();}
хорошо компилируется
Вот ответ на ваш вопрос: http://yosefk.com/c++fqa/mixing.html#fqa-32.6
По сути, вы не сможете его поймать. (но почему бы тебе просто не скомпилировать и не попробовать? :))