Saltar al contenido

Implementación de aserción de C++ en assert.h

Revisamos de forma completamente cada uno de los artículos en nuestra web con la meta de mostrarte en todo momento información más veraz y certera.

Solución:

Mira esta línea:

extern void __assert (const char *msg, const char *file, int line);

__assert es una función que toma como argumentos un mensaje de aserción, un nombre de archivo y un número de línea. Básicamente, este es el método que imprime el mensaje de error y finaliza el programa cuando falla la afirmación.

Entonces mira el macro definición anterior:

#define assert(EX) (void)((EX) || (__assert (#EX, __FILE__, __LINE__),0))

Define el assert(EX) macro entonces, primero verifica la expresión EX y (debido a la operación de cortocircuito de C++ || operador) sólo si falla, llama al __assert función y pasa la excepción de aserción fallida como una stringy la ubicación exacta del assert() llamada al método en sus archivos fuente. Con este truco del preprocesador, la biblioteca de aserciones logra que cuando escriba lo siguiente en su programa

assert(a == 0);

y su aserción falla durante la ejecución del programa, obtiene la información detallada

Assertion failed: a == 0 at program.c, line 23

mensaje de error que lo ayuda a identificar la ubicación exacta donde la afirmación estaba fallando en su código.

los (void) parte es solo para asegurarse de que el compilador no muestre algunas advertencias sobre el resultado no utilizado de la (EX) || 0 expresión, mira las otras respuestas, los chicos lo explicaron bien.

El preprocesador restante define NDEBUG se utiliza para desactivar la generación de aserciones en todo momento de compilación, su ejecutable resultante será más pequeño y más rápido.

__assert es parte de la implementación; en este caso, una función en la biblioteca a la que se llamará en caso de falla de aserción. Y el (void) es simplemente cerrar las advertencias del compilador sobre los resultados no utilizados del || operador.

Puntuaciones y comentarios

Puedes añadir valor a nuestro contenido cooperando tu veteranía en los informes.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *