2010-07-05 7 views
9

Tengo código C++ que usa algunas bibliotecas C. Las bibliotecas C toman devoluciones de llamadas en lenguaje C. Escribí una devolución de llamada en mi código C++ y ahora de alguna manera tengo que informar el error (pero se vuelve nulo). Me pregunto si puedo lanzar una excepción desde una devolución de llamada en C que se usa desde el código C++.¿Puedo arrojar excepciones de C++ de devoluciones de llamada de C heredadas?

Esto es muy difícil de entender para mí.

Gracias, Boda Cydo.

Respuesta

9

Sí, debería poder hacerlo. Sin embargo, tenga en cuenta que es muy probable que la biblioteca C no esté escrita para ser una excepción segura, y como resultado, puede dejar algunas de las estructuras de esa biblioteca en un estado inconsistente. Depende completamente de la biblioteca específica y de la función de devolución de llamada específica. Si nada más, esa biblioteca probablemente tendría que escribirse con soporte de C++ en mente desde el principio con respecto a esa devolución de llamada.

+1

+1 buen punto, la biblioteca C podría asignar memoria, abrir un archivo o una conexión de red antes de llamar a la función de devolución de llamada. Si lanza una excepción allí, la biblioteca no se borrará después. – Ozan

+0

Gracias por los consejos. Lo hice usar una variable global que se establece si se produjo un error. Todas las llamadas posteriores a esta función de devolución de llamada C simplemente vuelven y no hacen nada. Después de que la biblioteca finaliza con todas las llamadas C, y vuelvo a mi código C++, compruebo si se configuró esta variable global, y si fue así, informo de error. – bodacydo

+2

Sus dos primeras declaraciones son mutuamente contradictorias. "Sí, deberías poder hacerlo". - Bien. "Sin embargo, tenga en cuenta que es muy probable que la biblioteca C no haya sido escrita para ser una excepción segura" - Oh, entonces la respuesta es, en realidad, no. Nunca arroje excepciones a través del código que no se sabe que es una excepción segura. – JeremyP

1

Sí, podría lanzar una excepción desde su función C++. Sin embargo, solo se puede capturar con código C++, por lo que no se manejará en la biblioteca heredada.

+0

¿Quiso decir "de la función C"? – egrunin

+0

No. Si lanza una excepción, entonces la función no es C, ¿o sí? – Anthony

+0

Buen punto. ¿Es la devolución de llamada C o la devolución de llamada de C++ si lanzo desde allí? – bodacydo

Cuestiones relacionadas