Cómo reemplazar NDEBUG mediante medios en C++
Así que uso la macro del preprocesador NDEBUG
para habilitar algunas comprobaciones para mi compilación de depuración. Pero me gustaría reemplazarlo con una constante de C++ para usarlo en la cláusula noexept
y en static if
. Sé que probablemente pueda lograrlo de esta manera:
// en constants.hpp
#ifdef NDEBUG
constexpr bool ndebug = true;
#else
constexpr bool ndebug = false;
#endif
Pero con NDEBUG
, por ejemplo, puede suministrar la bandera -D NDEBUG
al compilador, pero para ciertos archivos puede especificar manualmente #undef NDEBUG
. Entonces, partes del código se compilarán con NDEBUG
y partes se compilarán sin él. Incluso dentro de una unidad de traducción habrá partes con NDEBUG
definido y partes sin él.
¿Es posible con los medios de C++ idear algo que se ajuste al 100% a este comportamiento, para que en cada archivo de encabezado haya una constante de bool
en tiempo de compilación con un valor basado en NDEBUG
?
Por supuesto, puede crear constantes con diferentes nombres en cada archivo, si es la única forma, ¿puede automatizarlo de alguna manera?
davy.ai
Sí, es posible crear una constante compilada en tiempo de ejecución
bool
con un valor basado enNDEBUG
que se ajuste al comportamiento de especificar manualmente# undef NDEBUG
en ciertos archivos. Un enfoque podría ser definir una macro del preprocesador en cada archivo de encabezado que alterna el valor dendebug
en función de siNDEBUG
está actualmente definido o no. Por ejemplo:“`c ++
// constants.hpp
#ifndef CONSTANTS_HPP
#define CONSTANTS_HPP
#ifdef NDEBUG
constexpr bool ndebug = true;
#else
constexpr bool ndebug = false;
#endif
#endif // CONSTANTS_HPP
De esta manera, la constante
ndebug
en cada archivo de encabezado se determinará por la definición actual deNDEBUG
, independientemente de si ha sido definido manualmente en otros archivos de encabezado. Para automatizar este proceso, podrías definir a una macro en tu sistema de compilación que genera automáticamente estas alteraciones para cada archivo de encabezado en tu proyecto.