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?
Respuesta
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.
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.
¿Por qué no debería usarlo para otra cosa? –
Bueno, si no lo usa para nada más que controlar 'assert', nunca necesitaría escribir' #ifndef NDEBUG'. – Lindydancer
¿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? –
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).
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.
- 1. ¿Por qué debería escribir [anView release], anView = nil; en lugar de [anView release] ;?
- 2. _DEBUG vs NDEBUG
- 3. ¿Cuándo define GCC NDEBUG?
- 4. ¿Por qué funciona esta implementación de COM IUnknown :: Release?
- 5. ¿Por qué darcs en lugar de git?
- 6. ¿Por qué Objectify en lugar de JDO?
- 7. ¿Por qué bloquear en lugar de buclear?
- 8. ¿Por qué FloatBuffer en lugar de flotar []?
- 9. ¿Por qué mvn release: prepare fail while tagging?
- 10. ¿Por qué la función close se llama release en `struct file_operations` en el kernel de Linux?
- 11. ¿Por qué CompositionTarget.Rendering toma EventArgs en lugar de RenderingEventArgs?
- 12. por qué usar - en lugar de _ en la url
- 13. ¿Por qué `this.synchronized` en lugar de simplemente` synchronized` en Scala?
- 14. ¿Por qué utilizar jQuery en() en lugar de clic()
- 15. ¿Por qué usar boost :: ice_or en lugar de || y boost :: ice_and en lugar de && en enable_if?
- 16. ¿Es seguro usar Free en lugar de Release para formularios modales en Delphi?
- 17. ¿Por qué NumPy en lugar de listas de Python?
- 18. Autorelease vs. Release
- 19. ¿Por qué usar tuplas en lugar de objetos?
- 20. ¿Por qué usar GWT.create() en lugar de nuevo?
- 21. ¿Por qué utilizar campos en lugar de propiedades?
- 22. ¿Por qué utilizar TagBuilder en lugar de StringBuilder?
- 23. ¿Por qué utilizar singleton en lugar de clase estática?
- 24. ¿Por qué usa Forth IF ENTONCES ... en lugar de ENDIF?
- 25. ¿Por qué la doctrina usa DONDE EN lugar de LÍMITE?
- 26. ¿Por qué null == myVar en lugar de myVar == null?
- 27. ¿Por qué el cacao usa delegados en lugar de herencia?
- 28. ¿Por qué HttpUtility.UrlEncode (HttpUtility.UrlDecode ("% 20")) devuelve + en lugar de% 20?
- 29. ¿Por qué utilizar EventArgs.Empty en lugar de null?
- 30. ¿Por qué alguien usaría C en lugar de C++?
'NDEBUG' simplemente implica * no depurar *. 'RELEASE' podría implicar más. – cnicutar
"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. –
'#if defined (RELEASE)' '#define NDEBUG'' # else' '#undef NDEBUG'' # endif' – pmg