Подтвердить что ты не робот

Могут ли функции С++ помечены как Extern "C" throw?

У меня есть функции С++, которые я хочу объявить, используя extern "C", хотя они только вызывается в коде на С++. Да, я знаю, это странно, но это то, что я хотел бы сделать для согласованности, так как мы смешали объявления C и С++. Я просто хочу убедиться, что объявление функции С++ как extern "C" не повлияет на поведение броска.

Он будет выглядеть примерно так:

extern "C" void foo() {throw exception;}

int bar()
{
    try
    {
        foo();
    } catch (exception e) { return 1; }
}
4b9b3361

Ответ 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

В принципе, вы не сможете его поймать. (но почему вы не просто скомпилируете его и попробуйте?:))