2012-02-10 18 views
10

La macro C assert estándar está deshabilitada cuando se define la macro NDEBUG, lo que significa "No depurar". Esto lleva a casos doble negativos realmente horribles como #ifndef NDEBUG //DebuggingCode #endif. Parece que LIBERACIÓN habría sido una mejor elección de términos, pero no puedo creer que el comité de estándares lo hubiera hecho de esa manera sin alguna razón para hacerlo ...¿Por qué NDEBUG en lugar de RELEASE?

+8

'NDEBUG' simplemente implica * no depurar *. 'RELEASE' podría implicar más. – cnicutar

+1

"Depurar"/"no depurar" tiene algún significado para prácticamente todos los entornos de programación. "Liberar"/"liberar software"/"hacer una publicación" es una conversación completamente diferente que ocurre mucho tiempo después de haber elegido los indicadores del compilador. –

+0

'#if defined (RELEASE)' '#define NDEBUG'' # else' '#undef NDEBUG'' # endif' – pmg

Respuesta

5

Tener una macro LIBERACIÓN implica que el código está listo para la distribución, cuando puede que no. NDEBUG, por otro lado, implica que la depuración está completa y, por lo tanto, está lista para la prueba.

También supongo que tener que apagar las cosas es mejor que tener que asegurarse de haber encendido todo. Es por eso que la mayoría de los sistemas operativos (por ejemplo) tienen la mayoría de las cosas encendidas cuando mucha gente no las necesita.

Solo mis humildes pensamientos.

5

La macro NDEBUG controla el comportamiento de assert.

Normalmente NO debe usarlo para nada más. Si lo usa para otras cosas, como salida de seguimiento de depuración extra, no tiene la opción de crear su aplicación sin este código adicional pero con las aserciones habilitadas.

Le recomendaría que defina su propio símbolo de preprocesador, digamos MY_TRACE, y úselo. Además, defínalo en 0 o 1 y use #if MY_TRACE. De esta forma, podría capturar archivos utilizando el símbolo sin haber sido inicializado correctamente, si configura su compilador para emitir una advertencia cuando usa una variable no inicializada en una expresión de preprocesador.

+1

¿Por qué no debería usarlo para otra cosa? –

+4

Bueno, si no lo usa para nada más que controlar 'assert', nunca necesitaría escribir' #ifndef NDEBUG'. – Lindydancer

+2

¿Qué sucede cuando tiene que dejar 'assert's habilitado para rastrear un raro error difícil de reproducir, pero no quiere que se arrojen miles de líneas de salida de depuración por todos lados? –

3

No puedo creer que el comité de estándares habría [optado por utilizar el nombre NDEBUG para controlar assert()] sin alguna razón para hacerlo ....

Sólo puedo imaginar, pero sospecho que puede haber habido varios nombres diferentes utilizados por varias implementaciones para controlar cómo funcionan las macros, y el comité posiblemente decidió elegir un nombre "neutral" que era poco probable que se use en el código existente por alguna razón no relacionada . Creo que podría haber sido bastante común que RELEASE se utilizara como una macro en un poco de código, por lo que usar ese nombre (o DEBUG) para controlar la macro assert() podría generar conflictos (particularmente para los usuarios que querrían un buen control de aserciones, activándolas solo para partes de código).

0

Como usuario de Eiffel a largo plazo puedo decirte que se usa de una manera diferente a la debug/nodebug. Como se señaló, el único efecto es deshabilitar las declaraciones de afirmación. El propósito de assert es agregar verificaciones previas y posteriores a la condición. Se recomienda su uso intensivo, y puede ralentizar el rendimiento de su programa en factor 10 o más. Esto se llama Diseño de hombres pobres por contrato.

Al usar NDEBUG, no significa que haya terminado con la depuración, solo que esta instrumentación de eliminación de errores es eliminada.

Desafortunadamente, el popular Depurar/Liberar no es el mejor caso en el desarrollo práctico donde, de hecho, tiene un modelo de lanzamiento Alpha, Beta, Release por buenas razones.

En el software alfa es tan defectuoso que lo compila sin símbolos NDEBUG y depurador. Beta se compila con los símbolos de configuración y depuración de NDEBUG (y quizás ya con los conmutadores de optimización) y la versión final se compila con NDEBUG y optimización completa.

Cuestiones relacionadas