example - ¿Se pueden marcar las funciones de C++ como Extern "C"?
extern function c (4)
Tengo funciones de C ++ que deseo declarar usando extern "C"
aunque solo se llaman en código de C ++. Sí, sé que esto es extraño, pero es algo que me gustaría hacer para mantener la coherencia, ya que hemos mezclado las declaraciones C y C ++. Solo quiero asegurarme de que declarar una función de C ++ como extern "C"
no afectará el comportamiento de lanzar.
Se vería algo como esto:
extern "C" void foo() {throw exception;}
int bar()
{
try
{
foo();
} catch (exception e) { return 1; }
}
"¿Se pueden marcar las funciones de C ++ como Extern" C "?"
Sí , en el sentido de que ni el lenguaje ni el compilador le impedirán hacerlo.
No , en el sentido de que si lanza, sería un comportamiento indefinido, ya que la excepción de C ++ cruza los límites del lenguaje.
En la práctica: no lo hagas. Capture la excepción y tradúzcala en un código de error, o un medio que el otro idioma pueda entender.
Por lo tanto, la conclusión es: NO lanzar excepciones de funciones marcadas como extern "C"
.
Aquí está la respuesta para su pregunta: http://yosefk.com/c++fqa/mixing.html#fqa-32.6
Básicamente no podrás atraparlo. (pero ¿por qué no lo compilas y lo intentas? :))
Para GCC la respuesta parece no concluyente .
La documentación de MSVC , sin embargo, es relativamente clara sobre el tema:
-
/EHa
y/EHs
... le dice al compilador que asuma que las funciones declaradas como externas "C" pueden generar una excepción. -
/EHsc
... le dice al compilador que asuma que las funciones declaradas como "C" externas nunca lanzan una excepción de C ++
Por lo tanto, para Visual-C ++ depende de las opciones del compilador, ya sea que obtenga un comportamiento definido.
se compilará, pero es un comportamiento indefinido lanzar desde la función marcada como que tiene un enlace C. C no tiene excepciones, por lo tanto, en general, solo debe devolver un código de error y / o proporcionar una función que devuelva la información sobre el último error.
#include <exception>
extern "C" void foo() {throw std::exception();}
compila bien