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