Digamos que quiero tener varios tipos de mensajes de salida en mi código. Uno de ellos es DEBUG
, que solo se imprime, cuando el código se compila en modo de depuración.
Por lo general, tendría que escribir algo como
#ifdef DEBUG
std::cout << "Debug message" << std::endl;
#endif
que es bastante engorroso y molesto de usar en muchos lugares.
¿Es una buena práctica definir una macro para el fragmento de código, por lo que lo usaría de esta manera?
MSG_DEBUG("Debug message")
¿O hay alguna otra manera más elegante de cómo tratarlo sin macros? Estoy interesado en posibles soluciones tanto en C como en C ++, ya que estoy usando ambos lenguajes en diferentes proyectos.
constexpr if
en C ++, por ejemplo.STDERR
. Además, ¿por qué no hacer que dependa de loNDEBUG
queassert()
hace en su lugar? Entonces podría definirlo como#define DEBUG_MSG(MSG) assert(std::cerr << MSG)
, que también prueba el estado de flujo.Respuestas:
Claro, si está de acuerdo con el uso de macros en primer lugar, entonces definir una parametrizada en lugar de seguir repitiendo el mismo código condicional es ciertamente preferible por cualquier medida de buena codificación.
¿Deberías usar macros? En mi opinión, debería hacerlo, ya que es una práctica aceptada en C, y cualquier solución sin macro requeriría que al menos algo se ejecute incluso fuera del modo de depuración. El programador típico de C elegirá una macro ligeramente fea sobre el esfuerzo innecesario de tiempo de ejecución en cualquier momento.
fuente
Aquí hay un elemento de preferencia personal, pero en C ++ prefiero hacer esto en el archivo de encabezado:
De modo que la función está en línea en las versiones de lanzamiento, pero es una función adecuada en la versión de depuración para que pueda tener una verificación de tipo adecuada, mensajes de error sensibles, etc. y la capacidad de agregar más funcionalidades (¿registro tal vez?) Más adelante.
Obviamente, también necesita encerrar la definición correspondiente de la función en el
.cpp
archivo en un#ifdef _DEBUG
bloque.fuente
Definitivamente, solo asegúrese de no pisar las pautas de código dadas por su equipo. Asegúrese de que ningún otro código en el sistema intente alcanzar la misma funcionalidad a través de una condición general if.
fuente