es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Sí, es posible crear una constante compilada en tiempo de ejecución bool con un valor basado en NDEBUG 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 de ndebug en función de si NDEBUG 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


    Luego, en cualquier archivo de encabezado donde desee alternar el valor de `ndebug`, puede definir una macro del preprocesador que anula la definición de `NDEBUG` antes de incluir `constants.hpp` y la redefine después. Por ejemplo: ```c ++ // example.hpp #ifndef EXAMPLE_HPP #define EXAMPLE_HPP #ifdef NDEBUG #define TOGGLE_NDEBUG #undef NDEBUG #else #define TOGGLE_NDEBUG #define NDEBUG #endif TOGGLE_NDEBUG #include "constants.hpp" TOGGLE_NDEBUG #endif // EXAMPLE_HPP

    De esta manera, la constante ndebug en cada archivo de encabezado se determinará por la definición actual de NDEBUG, 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.

Comments are closed.