<assert.h> es un archivo de cabecera de 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>está definido en ANSI C como parte de la biblioteca estándar de C. En el lenguaje de programación C++<assert.h> , y <cassert>están disponibles; ambos son funcionalmente equivalentes. [ 1 ]
Usar
La assertmacro implementa la aserción en tiempo de ejecución. Si la expresión dentro de ella es falsa, la macro imprimirá un mensaje stderry llamará a abort(), definida en <stdlib.h> . El mensaje incluye el nombre del archivo fuente y el número de línea fuente de las macros y , respectivamente. [ 2 ] Desde C99 , el nombre de la función de la instrucción assert se incluye como ( ) y la expresión misma. [ 3 ] En ANSI C, la expresión en la macro se define como entero con signo , aunque se puede usar cualquier expresión que se pueda convertir implícitamente a un entero con signo. En C99, la macro permite explícitamente cualquier tipo escalar . [ 4 ] Dos usos comunes de la macro son afirmar que un puntero no es nulo y asegurar que un índice de matriz está dentro de los límites. [ 5 ]__FILE____LINE____FUNC__assertassertassert
A continuación se muestra un programa que utiliza la assertmacro. Este programa siempre se evaluará pointercomo falso, ya que pointeres un puntero nulo y no apunta a una ubicación de memoria válida :
#include <assert.h> #include <stddef.h>int main () { void * ptr = NULL ; assert ( ptr ); return 0 ; }Tras compilar y ejecutar el programa, se mostrará un mensaje similar al siguiente:
programa: source.c:5: main: Falló la aserción 'ptr'. Abortado (volcado de núcleo)La definición de la assertmacro cambia dependiendo de la definición de otra macro NDEBUG. Si NDEBUGse define como un nombre de macro, la assertmacro se define como #define assert(ignore) ((void)0), [ 3 ] lo que resulta en que la macro no evalúe la expresión. El uso de NDEBUGpuede afectar el comportamiento general de un programa si una o más assertinstrucciones contienen efectos secundarios , ya que estas instrucciones no se evalúan. [ 6 ]
La assertmacro no incluye un mensaje de error . Sin embargo, se puede usar el operador coma para agregarlo a la expresión impresa, como en . [ 7 ]assert(("Not Orwellian",2+2==5));
Afirmación estática
La static_assertpalabra clave, añadida en C++11 , cumple una función similar a la de la assertmacro. A diferencia de la assertmacro, static_assertse ejecuta en tiempo de compilación en lugar de en tiempo de ejecución. [ 8 ] La implementación original utilizaba trucos de plantillas. La palabra clave recibe una expresión constante que puede convertirse en un valor booleano y un literal de cadena; si la expresión falla, se devuelve el literal de cadena; de lo contrario, la aserción no tiene efecto. [ 8 ] En C++17 , este mensaje de error de aserción se hizo opcional y el mensaje subsiguiente se omite si no se especifica. [ 9 ]static_assert
En C11_Static_assert , se agregó la declaración funcionalmente equivalente . <assert.h>define static_assertcomo un alias para _Static_assertasegurar la paridad con C++ . [ 10 ] En C23 , _Static_assertse renombró a static_asserty el argumento literal de cadena se hizo opcional. [ 11 ] [ 12 ] Gnulib define static_assertpara plataformas que no usan C11 y no requiere <assert.h>que se incluya. [ 13 ]
afirmación de contrato
La contract_assertpalabra clave, añadida en C++26 , se utiliza para aserciones de contrato y para verificar condiciones internas de forma similar a la assert()macro, asegurando que una condición se cumple durante la ejecución. [ 14 ] [ 15 ]
int f ( vector < int >& v ) pre ( v . size () >= 1 && v [ 0 ] > 0 ) post ( r : r == v [ 0 ] && r != 1 ) { // ... contract_assert ( v [ 0 ] != 1 ); // ... return v [ 0 ]; }Otros idiomas
En Java , assertes una palabra clave.
En C# , no existe una macro o palabra clave de aserción, sino clases System.Diagnostics.Debugque System.Diagnostics.Traceproporcionan Assert()métodos.
En Rust , existe una assert!()macro.
Referencias
Citas
- ↑ Binder 2000 , pág. 860.
- ↑ Kernighan y Ritchie 1988 , págs. 253-254.
- ^ ISO /IEC JTC 1/SC 22/WG14 1999 , pág. 169.
- ↑ "Manual del programador de Linux" . 25 de agosto de 2002. Consultado el 14 de marzo de 2023 .
- ↑ Reekie, John (7 de diciembre de 1995). "Cómo usar aserciones en C" . Universidad de California, Berkeley . Recuperado el 14 de marzo de 2023 .
- ↑ Instituto Nacional Estadounidense de Estándares 1990 , pág. 76.
- ↑ Gregoire 2021 , pág. 1058.
- ^ ISO /IEC JTC 1/SC 22/WG21 2012 , pág. 134.
- ↑ Swaminathan 2017 , pág. 13.
- ↑ Prata 2013 , págs. 762-763.
- ↑ Gustedt 2022 , pág. 3.
- ↑ Ballman y Grammatech 2018 , pág. 1.
- ↑ "GNU Gnulib" . Free Software Foundation . 6 de febrero de 2023. Consultado el 14 de marzo de 2023 .
- ^ Joshua Berne, Timur Doumler, Andrzej Krzemieński (13 de febrero de 2025). "Contratos para C++" (PDF) . open-std.org . Grupo de Trabajo 22.
{{cite web}}: CS1 maint: varios nombres: lista de autores ( enlace ) - ↑ "Aserciones de contrato (desde C++26)" . cppreference.com . cppreference . Consultado el 9 de noviembre de 2025 .
Bibliografía
- Instituto Nacional Estadounidense de Estándares (1990). Fundamentos del lenguaje de programación ANSI C. Summit: Silicon Press. ISBN 9780929306070.
- Ballman, Aaron; Grammatech (6 de julio de 2018). Armonización de static_assert con C++ (Informe).
- Binder, Robert (2000). Pruebas de sistemas orientados a objetos: modelos, patrones y herramientas (2.ª ed.). Boston: Addison-Wesley . ISBN 9780201809381.
- Gregoire, Marc (2021). Professional C++ (5.ª ed.). Hoboken: Wiley . ISBN 9781119695455.
- Gustedt, Jens (15 de febrero de 2022). Revisión de la ortografía de las palabras clave (Informe).
- Kernighan, Brian ; Ritchie, Dennis (1988). El lenguaje de programación C (2.ª ed.). Hoboken: Prentice Hall. ISBN 9780131103627.
- Lischner, Ray (2009). C++ en pocas palabras: una guía de referencia rápida para escritorio (2.ª ed.). Sebastopol: O'Reilly Media . ISBN 9781449378837.
- ISO/IEC JTC 1/SC 22/WG14 (diciembre de 1999). ISO/IEC 9899:1999 (Informe).
{{cite report}}: CS1 maint: nombres numéricos: lista de autores ( enlace ) - ISO/IEC JTC 1/SC 22/WG21 (enero de 2012). ISO/IEC 14882:2011 (Informe).
{{cite report}}: CS1 maint: nombres numéricos: lista de autores ( enlace ) - Prata, Stephen (2013). C Primer Plus (6.ª ed.). Londres: Pearson Education . ISBN 9780133432381.
- Swaminathan, Jeganathan (2017). Dominando la programación en C++ . Birmingham: Packt . ISBN 9781786461629.
- Encabezados de la biblioteca estándar de C