assert.h es un archivo de encabezado en la biblioteca estándar de C. Define la macro del preprocesador de C e implementa la aserción en tiempo de ejecución en C. assert
assert.h se define en ANSI C como parte de la biblioteca estándar de C. En el lenguaje de programación C++ , assert.h y están disponibles; ambos son funcionalmente equivalentes. [1]<cassert>
La assert
macro implementa la aserción en tiempo de ejecución. Si la expresión dentro de ella es falsa, la macro imprimirá un mensaje a stderr
y llamará a abort()
, definido en stdlib.h . El mensaje incluye el nombre del archivo de origen y el número de línea de origen de las macros __FILE__
y __LINE__
, respectivamente. [2] Desde C99 , el nombre de la función de la declaración de aserción se incluye como ( __FUNC__
) y la expresión en sí. [3] En ANSI C, la expresión en la assert
macro se define como entero con signo , aunque se puede utilizar cualquier expresión que pueda convertirse implícitamente a un entero con signo. En C99, la assert
macro permite explícitamente cualquier tipo escalar . [4] Dos usos comunes de la assert
macro son afirmar que un puntero no es nulo y garantizar que un índice de matriz esté dentro de los límites. [5]
A continuación se muestra un programa que utiliza la assert
macro. Este programa siempre se evaluará pointer
como falso, ya que pointer
es un puntero nulo y no apunta a una ubicación de memoria válida :
#include <assert.h> int main () { void * puntero = 0 ; assert ( puntero ); return 0 ; }
Al compilar el programa y ejecutarlo, aparecerá un mensaje similar al siguiente:
programa: source.c:5: main: La aserción 'puntero' falló. Se canceló (se realizó un volcado del núcleo)
La definición de la assert
macro cambia según la definición de otra macro, NDEBUG
. Si NDEBUG
se define como un nombre de macro, la assert
macro se define como #define assert(ignore) ((void)0)
, [3] por lo que la macro no evalúa la expresión. El uso de NDEBUG
puede afectar el comportamiento general de un programa si una o más assert
declaraciones contienen efectos secundarios , ya que estas declaraciones no se evalúan. [6]
La assert
macro no incluye un mensaje de error . Sin embargo, se puede utilizar el operador de coma para agregarlo a la expresión impresa, como en . [7]assert(("Not Orwellian", 2 + 2 == 5));
La static_assert
macro, agregada en C++11 , tiene un propósito similar al de la assert
macro. A diferencia de la assert
macro, static_assert
se ejecuta en tiempo de compilación en lugar de en tiempo de ejecución. [8] La implementación original usaba trucos de plantilla. [ cita requerida ] La static_assert
macro acepta una expresión constante que se puede convertir en un valor booleano y un literal de cadena; si la expresión falla, se devuelve el literal de cadena; de lo contrario, la macro no tiene efecto. [8] En C++17 , este mensaje de error de aserción se hizo opcional y el mensaje posterior se omite si no se especifica. [9]
En C11_Static_assert
, se agregó la declaración funcionalmente equivalente . assert.h se define static_assert
como un alias para _Static_assert
garantizar la paridad con C++ . [10] En C23 , _Static_assert
se renombró como static_assert
y el argumento literal de cadena se hizo opcional. [11] [12] Gnulib define static_assert
para plataformas que no usan C11 y no requieren que se incluya assert.h . [13]
{{cite report}}
: CS1 maint: nombres numéricos: lista de autores ( enlace ){{cite report}}
: CS1 maint: nombres numéricos: lista de autores ( enlace )