assert.h es un archivo de cabecera de la biblioteca estándar del lenguaje de programación C que define la C preprocesador macro assert()
. [1] [2] En C ++ también está disponible a través del
archivo de encabezado.
Afirmar
afirmar (a! = 1);
Esta es una macro que implementa una aserción en tiempo de ejecución , que se puede usar para verificar las suposiciones hechas por el programa e imprimir un mensaje de diagnóstico si esta suposición es falsa.
Cuando se ejecuta, si la expresión es falsa (es decir, se compara igual a 0), assert()
escribirá información sobre la llamada que falló stderr
y luego llamará abort()
. La información a la que escribe stderr
incluye:
- el nombre del archivo de origen (la macro predefinida
__FILE__
) - el número de línea de origen (la macro predefinida
__LINE__
) - la función de origen (el identificador predefinido
__func__
) (agregado en C99 ) - el texto de la expresión que se evaluó en 0 [1]
Salida de ejemplo de un programa compilado en Linux:
program: program.c: 5: main: La afirmación `a! = 1 'falló.Abortar (núcleo descargado)
Los programadores pueden eliminar las afirmaciones simplemente recompilando el programa, sin cambiar el código fuente: si la macro NDEBUG
se define antes de la inclusión de
, la assert()
macro puede definirse simplemente como:
# definir aserción (ignorar) ((anular) 0)
y por lo tanto no tiene ningún efecto sobre la unidad de compilación, ni siquiera evalúa su argumento. Por lo tanto, las expresiones pasadas a noassert()
deben contener efectos secundarios, ya que no sucederán cuando la depuración esté deshabilitada. Por ejemplo:
afirmar (x = obtiene ());
no leerá una línea y no asignará ax cuando la depuración esté deshabilitada.
Mensaje adicional
No existe una variante estandarizada assert()
que incluya un mensaje de error. No obstante, esto se puede lograr utilizando un operador de coma , que descarta todos los valores anteriores y solo conserva el último:
afirmar (( "orwelliano" , 2 + 2 == 5 ));
Producirá algo similar a:
program: program.c: 5: main: Assertion `(" Orwelliano ", 2 + 2 == 5) 'falló.Abortar
Se puede crear una sintaxis más conveniente con una macro, aquí usando el nombre que Microsoft usa [3] para una macro similar:
#define _ASSERT_EXPR (prueba, mensaje) assert (((void) (mensaje), prueba)) _ASSERT_EXPR ( 2 + 2 == 5 , "Orwelliano" );
Aserción estática
static_assert ( sizeof ( int ) > 20 , "Necesito números enteros enormes" );
C ++ 11 agregó una palabra clave similar static_assert
[4] que convierte contextualmente una expresión constante bool
e imprime un mensaje (opcional desde C ++ 17 [4] ) en tiempo de compilación si es falso. Es posible simular esto usando una macro y plantillas, aunque probablemente esto no sea necesario ya que la mayoría de los compiladores de C ++ modernos admiten esta característica de C ++ 11.
Esta característica se agregó formalmente en C11 como la palabra clave _Static_assert
con un uso idéntico, y en
una macro de conveniencia static_assert
se agrega.
Es posible simular una aserción estática en versiones anteriores de C usando una macro:, #define static_assert(cond, str) char _temp[-!((void)str, (cond))]
aunque el error resultante es críptico. (Desencadena un error porque C permite matrices de longitud cero, pero no de longitud negativa). La versión de Gnulib de la aserción estática usa sizeof y una estructura para desencadenar un error similar. [5]
Ejemplo
#include #include int main () { int i ; para ( i = 0 ; i <= 9 ; i ++ ) { aseverar ( i <= 4 ); printf ( "i =% d \ n " , i ); } return 0 ; }
i = 0i = 1i = 2i = 3i = 4afirmar: ejemplo.c: 10: principal: La afirmación `i <= 4 'falló.Abortado
enlaces externos
- Especificación única de UNIX , Edición 7 de The Open Group : verificar la aserción del programa - Referencia de definiciones básicas,
Referencias
- ^ a b Estándar internacional para el lenguaje de programación C (C99), ISO / IEC 9899: 1999, p. 169
- ^ [Referencia de C / C ++ de la página del programador de codificación] . Archivado desde el original el 30 de junio de 2012 . Consultado el 23 de marzo de 2012 .
- ^ "_ASSERT, _ASSERTE, _ASSERT_EXPR Macros" .
- ^ a b https://en.cppreference.com/w/cpp/language/static_assert
- ^ "gnulib / lib / verify.h" . coreutils. 24 de noviembre de 2019.