with usar try son que las instrucciones exceptions como catch c++ c gcc exception-handling

c++ - usar - ¿Existe una opción de gcc para suponer que todas las funciones externas "C" no pueden propagar excepciones?



try catch en c (4)

Cuando se levanta la excepción, genera una interrupción que desenrolla la pila y anula la pila existente. Sube hasta el punto donde está la sintaxis try / except. Esto significa que usted no tiene ninguna sobrecarga si no utiliza excepciones. Solo la sobrecarga en memoria / tiempo está en los bloques try / catch y la pila se desenrolla en throw ().

Si sus funciones c no generan excepciones, su sobrecarga estará solo en el espacio cuando llame a try / catch en su C ++, pero será igual para cualquier número de excepciones. (y poco tiempo de sobrecarga al inicializar este pequeño espacio con constante).

¿Hay alguna forma, aparte de poner un atributo en cada prototipo de función, para que gcc sepa que las funciones C nunca pueden propagar excepciones, es decir, que todas las funciones declaradas dentro de la extern "C" deben ser __attribute__((nothrow)) ? Lo ideal sería una opción de línea de comando de estilo -f .


GCC 4.5 parece optimizarlos para mí automáticamente. De hecho, esta línea aparece en la lista de cambios en http://gcc.gnu.org/gcc-4.5/changes.html :

  • GCC ahora optimiza el código de manejo de excepciones. En particular, se optimizan las regiones de limpieza que se ha demostrado que no tienen ningún efecto.

Nota al margen:
¿Estás seguro de que decirle al compilador "todas estas funciones nunca se lanzan" es exactamente lo que quieres?

No es necesariamente para que las funciones extern "C" ... no puedan propagar / desencadenar excepciones. Tomemos un ejemplo de ello:

class Foo { public: class Away {}; static void throwaway(void) { throw Away(); } } extern "C" { void wrap_a_call(void (*wrapped)(void)) { wrapped(); } } int main(int argc, char **argv) { wrap_a_call(Foo::throwaway); return 0; }

Compilar y ejecutar esto crea una función de enlace C wrap_a_call() que, cuando se llama como anteriormente, causará una excepción:

$ ./test terminate called after throwing an instance of ''Foo::Away'' Abort(coredump)

Es decir, puede haber una "fuga de excepción" con la extern "C" (a través de invocar los punteros a la función) y solo porque está usando / invocando funciones extern "C" en un lugar particular en C ++ no garantiza que no se puedan lanzar excepciones al invocar aquellos.


Siempre puede usar -fno-exceptions que asegurará que el compilador de c ++ no genere el código de propagación de excepciones.