2011-03-18 20 views
52

Tengo mi código lleno de llamada al assert(condition). En la versión de depuración utilizo g++ -g explotando mi aserción. Con mi sorpresa, puedo ver que la aserción funciona también en mi versión de lanzamiento, la compilada sin la opción -g.cómo deshabilitar por completo la aserción

¿Cómo puedo desactivar por completo en tiempo de compilación mi afirmación? ¿Debería definir explícitamente NDEBUG en cualquier compilación que produzca a pesar de que estén depuradas, lanzadas o lo que sea alguna otra?

+1

Algo fuera de tema: si desea información de depuración, '-g' es equivalente a' -g2'. '-g3' podría ser una mejor opción, ya que pone a disposición la información más simbólica. Por ejemplo, en '-g3', las #defines simbólicas estarán disponibles. Aunque parece que algunas cadenas de herramientas se ahogan en '-g3'.Además, muchas bibliotecas externas también dependen de '-DDEBUG' para las construcciones 'debug' (Posix solo certifica' -DNDEBUG' para 'versiones'). – jww

Respuesta

74

Debe #define NDEBUG (o usar la bandera -DNDEBUG con g ++) Esto desactivará afirman, siempre y cuando se define antes de la inclusión del archivo de cabecera afirman.

+0

debe estar antes de '#include '? –

9

Puede afirmaciones desactivar por completo por

#define NDEBUG 
#include <assert.h> 

o puede establecer NDEBUG (a través de -DNDEBUG) en su archivo MAKE/construir procedimiento, en función de si desea una versión productiva o prog.

3

Sí, defina NDEBUG en el sistema de línea de comandos/compilación con la opción de preprocesador/compilador -DNDEBUG.

Esto no tiene nada que ver con la información de depuración insertada por -g.

9

El indicador -g no afecta al funcionamiento de assert, solo garantiza que haya varios símbolos de depuración disponibles.

La configuración NDEBUG es la forma estándar (como en el estándar oficial, ISO) de deshabilitar las aserciones.

30

Use #define NDEBUG

7.2 Diagnóstico

1 La cabecera define la aserción macro y se refiere a otro macro,

NDEBUG

que no es de fi nido por <assert.h>. Si NDEBUG se define como un nombre de macro en el punto en el origen de fi le donde se incluye, la aserción macro se define simplemente como

#define assert(ignore) ((void)0)

El aserción macro está redefinido según el estado actual de NDEBUG cada vez que <assert.h> está incluido.

+1

¡Hola! Si es verdad que cuando defino -DNDEBUG, todavía una llamada para afirmar ejecuta algo, es decir, (vacío) 0), ¿va a pasar un mínimo de ciclos de CPU? Pensé que estaba mapeado simplemente a nada, es decir, completamente SIN CÓDIGO ... ¿no es así? –

+0

@Abruzzo: También pensé que hasta ahora, pero pensándolo bien, esto dejaría un ';' vacío, en cambio, lo que puede ser problemático si el 'assert' está dentro de un' si', por ejemplo. Estoy seguro de que el compilador optimiza las líneas como '0;' de distancia – davka

+0

@Abruzzo, y por cierto, compruebe si su IDE o su sistema de compilación le permite especificar una plantilla predeterminada para un nuevo proyecto. Entonces puede tener definido NDEBUG en la configuración de Release de cada nuevo proyecto – davka

Cuestiones relacionadas