Могут ли функции C ++ помечены как Extern & quot; C & quot; бросить?

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

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

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

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

22

Решение

Msgstr «Могут ли функции C ++, помеченные как Extern» C «, генерировать?»

да, в том смысле, что ни язык, ни компилятор не помешают вам сделать это.

нет, в том смысле, что если вы бросите, это будет неопределенное поведение, так как исключение C ++ пересекает языковые границы.

На практике: не делай этого. Поймайте исключение и переведите его в код ошибки или средство, понятное другому языку.

Итак, итоги: не делайте выбросить исключение из функций, помеченных как extern "C",

8

Другие решения

За GCC ответ кажется неубедительным.

Документация MSVC, однако относительно ясно по этому вопросу:

  • /EHa а также /EHsговорит компилятору предположить, что функции, объявленные как extern «C», могут вызвать исключение.
  • /EHscговорит компилятору предположить, что функции, объявленные как extern «C», никогда не выдают исключение C ++

Так что для Visual-C ++ это зависит от параметров компилятора, получите ли вы определенное поведение.

5

он будет скомпилирован, но это не определенное поведение для выброса из функции, помеченной как связанная с Си. C не имеет исключений, поэтому в общем случае вы должны просто вернуть код ошибки и / или предоставить функцию, которая возвращает информацию о последней ошибке.

#include <exception>
extern "C" void foo() {throw std::exception();}

хорошо компилируется

2

Вот ответ на ваш вопрос: http://yosefk.com/c++fqa/mixing.html#fqa-32.6

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

0
По вопросам рекламы [email protected]