c++ - programar - _DEBUG contra NDEBUG
programar en linea c++ (6)
¿Es el estándar NDEBUG?
Sí, es una macro estándar con la semántica "No depurar" para los estándares C89, C99, C ++ 98, C ++ 2003, C ++ 2011, C ++ 2014. No hay macros _DEBUG
en los estándares.
El estándar C ++ 2003 envía el lector a la "página 326" en "17.4.2.1 Encabezados" al estándar C.
Ese NDEBUG es similar a Esto es lo mismo que la biblioteca estándar C.
En C89 (los programadores de C llamaron a este estándar como estándar C) en la sección "4.2 DIAGNÓSTICOS" se dijo
http://port70.net/~nsz/c/c89/c89-draft.html
Si NDEBUG se define como un nombre de macro en el punto en el archivo de origen donde se incluye, la macro assert se define simplemente como
#define assert(ignore) ((void)0)
Si observa el significado de _DEBUG
macros de _DEBUG
en Visual Studio https://msdn.microsoft.com/en-us/library/b0084kay.aspx , se verá que esta macro se define automáticamente por la versión de biblioteca de tiempo de ejecución de idioma .
¿Qué preprocesador define debería usarse para especificar secciones de depuración de código?
Use #ifdef _DEBUG
o #ifndef NDEBUG
o existe una forma mejor de hacerlo, p. Ej. #define MY_DEBUG
?
Creo que _DEBUG
es específico de Visual Studio, ¿es estándar NDEBUG?
Confío en NDEBUG
, porque es el único cuyo comportamiento está estandarizado en los compiladores y las implementaciones (consulte la documentación para la macro de afirmación estándar). La lógica negativa es una velocidad de lectura reducida, pero es un idioma común al que puedes adaptarte rápidamente.
_DEBUG
en algo como _DEBUG
sería confiar en un detalle de implementación de un compilador particular y la implementación de una biblioteca. Otros compiladores pueden o no elegir la misma convención.
La tercera opción es definir su propia macro para su proyecto, lo cual es bastante razonable. Tener su propia macro le ofrece portabilidad en todas las implementaciones y le permite habilitar o deshabilitar su código de depuración independientemente de las aserciones. Aunque, en general, desaconsejo tener diferentes clases de información de depuración que estén habilitadas en tiempo de compilación, ya que causa un aumento en la cantidad de configuraciones que tiene que compilar (y probar) para obtener un beneficio posiblemente pequeño.
Con cualquiera de estas opciones, si utiliza un código de terceros como parte de su proyecto, deberá conocer qué convención utiliza.
El macro NDEBUG controla si las declaraciones assert () están activas o no.
En mi opinión, eso está separado de cualquier otra depuración, así que uso algo que no sea NDEBUG para controlar la información de depuración en el programa. Lo que uso varía, dependiendo del marco con el que estoy trabajando; diferentes sistemas tienen diferentes macros habilitadoras, y yo uso lo que sea apropiado.
Si no existe un marco, usaría un nombre sin un subrayado inicial; esos tienden a estar reservados a ''la implementación'' y trato de evitar problemas con colisiones de nombres, doblemente cuando el nombre es una macro.
Lamentablemente, "DEBUG" está sobrecargado. Por ejemplo, se recomienda siempre generar y guardar un archivo pdb para versiones RELEASE. Lo que significa una de las opciones -Zx flags, y -DEBUG linker. Mientras que _DEBUG se relaciona con versiones especiales de depuración de la biblioteca en tiempo de ejecución, como llamadas a malloc y gratuitas. Entonces NDEBUG desactivará las aserciones.
Sea consistente y no importa cuál. Además, si por algún motivo debe interoperar con otro programa o herramienta utilizando un determinado identificador DEBUG, es fácil de hacer
#ifdef THEIRDEBUG
#define MYDEBUG
#endif //and vice-versa
Visual Studio define _DEBUG
cuando especifica la /MTd
o /MDd
, NDEBUG
deshabilita las aserciones de C estándar. Úselos cuando corresponda, es decir, _DEBUG
si desea que su código de depuración sea coherente con las técnicas de depuración de MS CRT y NDEBUG
si desea ser coherente con assert()
.
Si define sus propias macros de depuración (y no hackea el compilador o el tiempo de ejecución de C), evite los nombres iniciales con un guión bajo, ya que están reservados.