_DEBUG frente a NDEBUG

Resuelto deft_code asked hace 14 años • 7 respuestas

¿Qué definición de preprocesador debería usarse para especificar secciones de código de depuración?

Utilice #ifdef _DEBUGo #ifndef NDEBUGo ¿hay una mejor manera de hacerlo, por ejemplo #define MY_DEBUG?

Creo _DEBUGque Visual Studio es específico, ¿NDEBUG es estándar?

deft_code avatar Feb 18 '10 23:02 deft_code
Aceptado

Visual Studio define _DEBUGcuando especifica la opción /MTdo 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 ./MDdNDEBUG_DEBUGNDEBUGassert()

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.

Christoph avatar Feb 18 '2010 17:02 Christoph

¿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 _DEBUGmacros 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 _DEBUGlas 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.

Konstantin Burlachenko avatar Mar 25 '2015 10:03 Konstantin Burlachenko