У меня есть функции C++, которые я хочу объявить, используя extern "C"
, хотя они только вызывается в коде на C++. Да, я знаю, что это странно, но это то, что я хотел бы сделать для согласованности, поскольку мы смешивали объявления C и C++. Я просто хочу убедиться, что объявление функции C++ как extern "C"
не повлияет на поведение метания.Может ли функции C++ помечены как Extern «C» throw?
Это будет выглядеть примерно так:
extern "C" void foo() {throw exception;}
int bar()
{
try
{
foo();
} catch (exception e) { return 1; }
}
[Родственный вопрос] (http://stackoverflow.com/questions/4695741/is-there-a-gcc-option-to-assume-all-extern-c-functions-cannot-propagate-except). –
Ответы утверждают, что вы вызываете неопределенное поведение, если исключение выбрано из кода C++ в фактический код C (который не знал, что делать с исключением). Я думаю, что это правильно, но вы спрашиваете о вызове 'extern 'C' 'функций из C++ или C?Если вы вызываете их из C++ (и никогда не с C), возникает неизбежный вопрос: «Почему функции« extern »C« если они никогда не вызываются с другого языка? », Но я думаю, что просто вызов функций C++ с 'extern 'C" из C++ означает, что границы языка не пересекаются и, следовательно, не определено неопределенное поведение. –
Спасибо всем, кто внес свой вклад в ответ на это. Если я правильно понял, окончательный ответ на мой вопрос заключался в следующем: extern «C» не меняет способ обработки исключения. Однако бросание исключения, которое не поймано и пересекает границы языка, имеет неопределенное поведение. –