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.
Para confiar en algo como _DEBUG
sería confiar en un detalle de implementación de un compilador particular y la implementación de la 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 código de terceros como parte de su proyecto, deberá conocer qué convención utiliza.
+1. NDEBUG, en particular, se permite # undef'd y # define'd dentro de una sola TU (y la inclusión de cambia la macro de assert en consecuencia). Debido a que esto es diferente de lo esperado/deseado, es común usar otra macro para controlar una bandera de depuración de "compilación" como lo dice esta respuesta. –
Aparentemente, es el compilador el que define estas macros y no Visual Studio (el IDE). Muchas gracias por esta respuesta! –
NDEBUG no está definido cuando se usan plantillas de aplicaciones del Kit de controladores de Windows 8.1 también. En este caso, es posible que deba confiar en _DEBUG. – navossoc