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.