_DEBUG frente a NDEBUG
¿Qué definición de preprocesador debería usarse para especificar secciones de código de depuración?
Utilice #ifdef _DEBUG
o #ifndef NDEBUG
o ¿hay una mejor manera de hacerlo, por ejemplo #define MY_DEBUG
?
Creo _DEBUG
que Visual Studio es específico, ¿NDEBUG es estándar?
Visual Studio define _DEBUG
cuando especifica la opción /MTd
o deshabilita las aserciones de C estándar. Utilícelos cuando sea apropiado, es decir, si desea que su código de depuración sea coherente con las técnicas de depuración de MS CRT y si desea ser coherente con ./MDd
NDEBUG
_DEBUG
NDEBUG
assert()
Si define sus propias macros de depuración (y no piratea el compilador o el tiempo de ejecución de C), evite comenzar los nombres con un guión bajo, ya que están reservados.
¿Es NDEBUG estándar?
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 _DEBUG
macros en los estándares.
El estándar C++ 2003 envía el lector en 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 C estándar.
En C89 (los programadores de C llamaron a este estándar estándar C) en la sección "4.2 DIAGNÓSTICO" se decía
https://port70.net/~nsz/c/c89/c89-draft.html
Si NDEBUG se define como un nombre de macro en el punto del archivo fuente donde se incluye <assert.h>, la macro de afirmación se define simplemente como
#define assert(ignore) ((void)0)
Si observa el significado de _DEBUG
las macros en Visual Studio
https://learn.microsoft.com/en-us/cpp/preprocessor/predefinido-macros
, verá que esta macro se define automáticamente según la biblioteca de tiempo de ejecución del idioma que elija. versión.