Namespaces
Variants

assert

From cppreference.net
< c ‎ | error
Definido en el encabezado <assert.h>
#ifdef NDEBUG

#define assert(condition) ((void)0)
#else
#define assert(condition) /*implementation defined*/

#endif
(hasta C23)
#ifdef NDEBUG

#define assert(...) ((void)0)
#else
#define assert(...) /*implementation defined*/

#endif
(desde C23)

La definición de la macro assert depende de otra macro, NDEBUG , que no está definida por la biblioteca estándar.

Si NDEBUG está definido como un nombre de macro en el punto del código fuente donde <assert.h> es incluido, entonces assert no hace nada.

Si NDEBUG no está definido, entonces assert verifica si su argumento (hasta C23) la expresión sintetizada de __VA_ARGS__ (desde C23) (que debe tener tipo escalar, de lo contrario, el comportamiento es indefinido) se compara igual a cero. Si es así, assert emite información de diagnóstico específica de la implementación en la salida de error estándar y llama a abort ( ) . Se requiere que la información de diagnóstico incluya el texto de expression , así como los valores de la variable predefinida __func__ y de (desde C99) las macros predefinidas __FILE__ y __LINE__ .

Contenidos

Parámetros

condición - expresión de tipo escalar

Valor de retorno

(ninguno)

Notas

No existe una interfaz estandarizada para agregar un mensaje adicional a los errores de assert . Una forma portable de incluir uno es usar el operador coma , o utilizar && con un literal de cadena:

assert(("Hay cinco luces", 2 + 2 == 5));
assert(2 + 2 == 5 && "Hay cinco luces");

La implementación de assert en Microsoft CRT no cumple con C99 y revisiones posteriores, porque su función subyacente ( _wassert ) no toma ni __func__ ni un reemplazo equivalente.

Aunque el cambio de assert en C23 ( N2829 ) no es un informe de defectos formal, el comité de C recomienda a las implementaciones que retroporten el cambio a modos antiguos.

Ejemplo

#include <stdio.h>
// uncomment to disable assert()
// #define NDEBUG
#include <assert.h>
#include <math.h>
#define TEST(...) __VA_ARGS__
int main(void)
{
    double x = -1.0;
    assert(x >= 0.0);
    printf("sqrt(x) = %f\n", sqrt(x));
    assert(TEST(x >= 0.0));
    return 0;
}

Salida posible:

--- Output with NDEBUG not defined: ---
a.out: main.cpp:10: main: Assertion `x >= 0.0' failed.
--- Output with NDEBUG defined: ---
sqrt(x) = -nan

Referencias

  • Estándar C23 (ISO/IEC 9899:2024):
  • 7.2.2.1 La macro assert (p: 196)
  • Estándar C17 (ISO/IEC 9899:2018):
  • 7.2.1.1 La macro assert (p: 135)
  • Estándar C11 (ISO/IEC 9899:2011):
  • 7.2.1.1 La macro assert (p: 186-187)
  • Estándar C99 (ISO/IEC 9899:1999):
  • 7.2.1.1 La macro assert (p: 169)
  • Estándar C89/C90 (ISO/IEC 9899:1990):
  • 4.2.1.1 La macro assert

Véase también

provoca la terminación anormal del programa (sin limpieza)
(función)