ejemplos - funciones en c++ pdf
¿El estándar de C++ exige que las funciones de enlace C sean `noexcept`? (2)
Por lo que sé, no hay garantía de que la función definida con el enlace "C" no arroje excepciones. El estándar permite que un programa C ++ llame a una función externa con enlace de lenguaje "C", y que defina funciones escritas en C ++ que tengan enlace de lenguaje "C". Por lo tanto, no hay nada que impida que un programa C ++ llame a una función con un enlace de lenguaje "C" que esté realmente escrito en C ++ (quizás en otra unidad de compilación, aunque incluso esto no es necesario). Sería algo extraño, pero es difícil de descartar. Además, no veo en qué parte del estándar dice que hacerlo conduciría a un comportamiento indefinido (de hecho, dado que el Estándar no puede definir el comportamiento de la función no escrito en C ++, este sería el único uso donde no hay un comportamiento formalmente indefinido ).
Como consecuencia, creo que sería un error suponer que el vínculo "C" implica noexcept
.
No puedo encontrar nada en el estándar que obligue a que las funciones declaradas con extern "C"
sean noexcept
, implícitamente o explícitamente.
Sin embargo, debe quedar claro que las convenciones de llamada C no pueden admitir excepciones ... ¿o no?
¿El estándar menciona esto, en algún lugar que me he perdido? ¿Si no, porque no? ¿Se deja simplemente como un detalle de implementación?
Um, asumo que la extern "C"
solo usa el enlace C, no la función C. Evita que el compilador haga el nombre de C ++ .
Más directamente - Supongamos este código.
// foo.cpp
extern "C" void foo()
{
throw 1;
}
// bar.cpp
extern "C" void foo();
void bar()
{
try
{
foo();
}
catch (int)
{
// yeah!
}
}