Siempre pensé que assert era solo una función de reporte de errores; de hecho, resulta que es una macro, y su función no es "reportar errores".
Después de conocerlo un poco, descubrí que el uso de assert() es como una "programación por contrato". En mi entendimiento, lo que expresa es que el programa puede funcionar correctamente bajo mis condiciones supuestas; en realidad equivale a una sentencia if:
if(假设成立)
{
程序正常运行;
}
else
{
报错&&终止程序!(避免由程序运行引起更大的错误)
}
Pero si se escribe así, habría innumerables sentencias if, e incluso podría aparecer un if cuyos paréntesis se extiendan desde el inicio del archivo hasta el final. Y en la mayoría de los casos, las suposiciones que queremos verificar son solo eventos fortuitos, o simplemente queremos probar si ocurren algunos de los peores casos. Por eso aquí está assert().
El prototipo de la macro assert se define en assert.h. Su función es que si su condición devuelve un error, termina la ejecución del programa.
#include "assert.h" void assert( int expression );
La función de assert es calcular primero la expresión expression; si su valor es falso (es decir, 0), primero imprime un mensaje de error en stderr y luego termina la ejecución del programa llamando a abort.
La desventaja de usar assert es que las llamadas frecuentes afectan en gran medida el rendimiento del programa, añadiendo una sobrecarga adicional.
Después de finalizar la depuración, se puede deshabilitar la llamada a assert insertando #define NDEBUG antes de la sentencia que incluye #include. El código de ejemplo es el siguiente:
#include #define NDEBUG #include
Resumen de uso y precauciones
1) Verificar la validez de los parámetros pasados al inicio de la función
Como:
int resetBufferSize(int nNewSize)
{
//功能:改变缓冲区大小,
//参数:nNewSize 缓冲区新长度
//返回值:缓冲区当前长度
//说明:保持原信息内容不变 nNewSize<=0表示清除缓冲区
assert(nNewSize >= 0);
assert(nNewSize <= MAX_BUFFER_SIZE);
...
}
2) Cada assert debe verificar solo una condición, porque al verificar múltiples condiciones a la vez, si la aserción falla, no se puede juzgar intuitivamente cuál condición falló.
Malo:
assert(nOffset>=0 && nOffset+nSize<=m_nInfomationSize);
Bueno:
assert(nOffset >= 0); assert(nOffset+nSize <= m_nInfomationSize);
3) No se deben usar sentencias que modifiquen el entorno, porque assert solo es efectivo en DEBUG. Si se hace esto, el programa encontrará problemas cuando realmente se ejecute.
Incorrecto: assert(i++ < 100)
Esto se debe a que si ocurre un error, por ejemplo, si i=100 antes de la ejecución, entonces esta sentencia no se ejecutará, por lo que el comando i++ no se ejecutará.
Correcto:
assert(i < 100) i++;
4) assert y la sentencia siguiente deben estar separados por una línea en blanco para formar una sensación de coherencia lógica y visual.
5) En algunos lugares, assert no puede reemplazar el filtrado de condiciones.
Los programas generalmente se dividen en versión Debug y versión Release. La versión Debug se usa para la depuración interna, y la versión Release se distribuye a los usuarios. La aserción assert es una macro que solo funciona en la versión Debug; se usa para verificar situaciones que "no deberían" ocurrir. El siguiente es un programa de copia de memoria. Durante la ejecución, si el parámetro de assert es falso, el programa se detendrá (generalmente también aparecerá un cuadro de diálogo de aviso que indica dónde se provocó el assert).
Los siguientes son varios principios para usar aserciones:
- (1) Usar aserciones para capturar situaciones ilegales que no deberían ocurrir. No confundir situaciones ilegales con situaciones de error; estas últimas existen inevitablemente y deben manejarse.
- (2) Usar aserciones para confirmar los parámetros de las funciones.
- (3) Al escribir funciones, se debe examinar repetidamente y preguntarse: "¿Qué suposiciones pretendo hacer?". Una vez determinadas las suposiciones, se deben usar aserciones para verificarlas.
- (4) Los libros de texto generalmente alientan a los programadores a realizar programación a prueba de errores, pero hay que recordar que este estilo de programación puede ocultar errores. Al programar a prueba de errores, si algo que "no puede ocurrir" realmente ocurre, se debe usar una aserción para alertar.
ASSERT() es una macro que se usa con frecuencia al depurar programas. Durante la ejecución del programa, calcula la expresión entre paréntesis. Si la expresión es FALSE (0), el programa informará del error y terminará la ejecución. Si la expresión no es 0, continúa ejecutando las sentencias siguientes. Esta macro se usa generalmente para determinar si han aparecido datos claramente ilegales en el programa. Si aparecen, se termina el programa para evitar consecuencias graves, y también facilita la búsqueda de errores.
ASSERT solo es válido en la versión Debug; si se compila como versión Release, se ignora.
Dirección original: https://www.cnblogs.com/thisway/p/5558914.html