2008-11-06 17 views

Respuesta

22

Si compilar en modo de lanzamiento incluye definir NDEBUG, entonces sí.

Ver assert (CRT)

+0

Las documentaciones afirma "La rutina aserción está disponible tanto en las versiones de lanzamiento y de depuración de las bibliotecas de C en tiempo de ejecución." Sin embargo, mirando el encabezado assert.h, es cierto que definir NDEBUG antes de incluirlo hará que assert() compile a un no-op. Sin embargo, es totalmente posible que el código del modo de lanzamiento no defina NDEBUG para hacer abortar una aserción. Solo quería aclarar mi propio entendimiento y compartir lo que encontré. –

4

IIRC, assert (x) es una macro que no se evalúa en nada cuando se define NDEBUG, que es el estándar para las compilaciones de Release en Visual Studio.

2

Solo si se define NDEBUG creo (que será de manera predeterminada para las aplicaciones de Visual C++).

5

La macro de afirmación (al menos típicamente es una macro) generalmente se define como no operativa en el código de lanzamiento. Solo se activará en el código de depuración. Una vez dicho esto. He trabajado en lugares que definieron su propia macro assert, y se activó tanto en el modo de depuración como en el de liberación.

Me enseñaron a usar afirmaciones para condiciones que "nunca" pueden ser falsas, como las condiciones previas para una función.

1

Creo que es un error confiar demasiado en el comportamiento exacto de la aserción. La semántica correcta de "assert (expr)" es:

  • La expresión expr puede o no evaluarse.
  • Si expr es verdadero, la ejecución continúa normalmente.
  • Si expr es falso, lo que sucede no está definido.

Más contenido en http://nedbatchelder.com/text/assert.html

+1

La semántica correcta se describe en ISO C. Si las aserciones están habilitadas ('NDEBUG' no está definido antes de incluir' ') entonces si la expresión de control de un' assert' se compara con cero, entonces el texto de la expresión, el archivo y el número de línea se imprimen en algún mensaje definido por la implementación en el flujo de error estándar. Luego se llama a la función 'abortar '. (A partir de C99, se requiere el mensaje para incluir también el nombre de la función). – Kaz

0

misma para GNU:

#ifdef NDEBUG 

    # define assert(expr)  (__ASSERT_VOID_CAST (0)) 
Cuestiones relacionadas