Una aserción es un predicado de que la condición presentada debe ser verdadera en el momento en que el software encuentra la aserción. Las más comunes son las aserciones simples , que se validan en el momento de la ejecución. Sin embargo, las afirmaciones estáticas se verifican en el momento de la compilación.
Parámetro | Detalles |
---|---|
expresión | Expresión de tipo escalar. |
mensaje | cadena literal que se incluirá en el mensaje de diagnóstico. |
Tanto assert
como static_assert
son macros definidas en assert.h
.
La definición de assert
depende de la macro NDEBUG
que no se define por la biblioteca estándar. Si se define NDEBUG
, assert
es un no-op:
#ifdef NDEBUG # define assert(condition) ((void) 0) #else # define assert(condition) /* implementation defined */ #endif
La opinión varía sobre si NDEBUG
siempre debe usarse para compilaciones de producción.
assert
llamadas abort
y los mensajes de aserción no son útiles para los usuarios finales, por lo que el resultado no es útil para el usuario. Si tiene condiciones fatales para verificar el código de producción, debe usar las condiciones ordinarias if/else
y exit
o quick_exit
para finalizar el programa. En contraste con la abort
, estos permiten que el programa realice una limpieza (a través de las funciones registradas con atexit
o at_quick_exit
). assert
llamadas nunca deben disparar en el código de producción, pero si lo hacen, la condición que se comprueba significa que hay algo radicalmente equivocado y el programa se comportará mal peor si la ejecución continúa. Por lo tanto, es mejor tener las afirmaciones activas en el código de producción porque si se disparan, el infierno ya se ha desatado. abort
) y la producción (donde un "error interno inesperado (contacte al Soporte Técnico" puede ser más apropiado). static_assert
expande a _Static_assert
que es una palabra clave. La condición se verifica en el momento de la compilación, por lo que la condition
debe ser una expresión constante. No hay necesidad de que esto se maneje de manera diferente entre el desarrollo y la producción.