assert
|
Definido en el encabezado
<assert.h>
|
||
|
#ifdef NDEBUG
#define assert(condition) ((void)0)
|
(hasta C23) | |
|
#ifdef NDEBUG
#define assert(...) ((void)0)
|
(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
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) |
|
|
C++ documentation
para
assert
|
|