7.11 Исключения Java
Язык Java использует немного другую модель обработки исключений, чем C++. Обычно GNU C++ автоматически обнаруживает, когда вы пишете код C++, использующий исключения Java, и обрабатывает их должным образом. Однако, если код C++ должен только выполнить деструкторы при возникновении исключений Java, GCC угадывает неправильно. Пример проблемного кода:
struct S { ~S(); };
extern void bar(); // is written in Java, and may throw exceptions
void foo()
{
S s;
bar();
} Обычно результатом неправильного угадывания является ошибка линковки, сообщающая о недостающей функции, называемой ‘__gxx_personality_v0’.
Вы можете сообщить компилятору, что исключения Java должны использоваться в единице трансляции, независимо от того, что он думает, написав ‘#pragma GCC java_exceptions’ в начале файла. Этот ‘#pragma’ должен появиться перед любыми функциями, которые генерируют или ловят исключения, или выполняют деструкторы, когда исключения возникают в них.
Вы не можете смешивать исключения Java и C++ в одной единице трансляции. Предполагается, что безопасно генерировать исключение C++ из одного файла через другой файл, скомпилированный для модели исключений Java, или наоборот, но могут быть ошибки в этой области.
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-4.9.4/gcc/Java-Exceptions.html