dbg(…)
Una macro para los fanáticos de la depuración al estilo printf
.
Los depuradores son geniales. Pero a veces simplemente no tienes el tiempo o la paciencia para configurar todo correctamente y sólo quieres una forma rápida de inspeccionar algunos valores en tiempo de ejecución.
Este proyecto proporciona un archivo de encabezado único con una macro dbg(…)
que se puede usar en todas las circunstancias en las que normalmente escribiría printf("…", …)
o std::cout << …
. Pero viene con algunos extras.
# include < dbg.h >
# include < cstdint >
# include < vector >
// You can use "dbg(..)" in expressions:
int32_t factorial ( int32_t n) {
if ( dbg (n <= 1 )) {
return dbg ( 1 );
} else {
return dbg (n * factorial (n - 1 ));
}
}
int32_t main () {
std::string message = " hello " ;
dbg (message); // [example.cpp:15 (main)] message = "hello" (std::string)
const int32_t a = 2 ;
const int32_t b = dbg ( 3 * a) + 1 ; // [example.cpp:18 (main)] 3 * a = 6 (int32_t)
std::vector< int32_t > numbers{b, 13 , 42 };
dbg (numbers); // [example.cpp:21 (main)] numbers = {7, 13, 42} (std::vector<int32_t>)
dbg ( " this line is executed " ); // [example.cpp:23 (main)] this line is executed
factorial ( 4 );
return 0 ;
}
El código anterior produce este resultado (pruébelo usted mismo):
std::optional
, etc.dbg.h
emite una advertencia del compilador cuando se incluye (para que no olvide eliminarlo). Para que esto sea práctico, el encabezado dbg.h
debe estar disponible desde todo tipo de lugares diferentes y en todo tipo de entornos. La forma rápida y sucia es copiar el archivo de encabezado a /usr/local/include
o clonar el repositorio y vincular simbólicamente dbg.h
a /usr/local/include/dbg.h
.
git clone https://github.com/sharkdp/dbg-macro
sudo ln -s $( readlink -f dbg-macro/dbg.h ) /usr/local/include/dbg.h
Si no desea realizar cambios sin seguimiento en su sistema de archivos, verifique a continuación si existe un paquete para su sistema operativo o administrador de paquetes.
Puede instalar dbg-macro
desde AUR:
yay -S dbg-macro
Puede instalar el puerto dbg-macro
a través de:
vcpkg install dbg-macro
CMakeLists.txt
cmake_minimum_required ( VERSION 3.11) # FetchContent added in cmake 3.11
project (app) # name of executable
set (CMAKE_CXX_STANDARD 17)
# dbg-macro
include (FetchContent)
FetchContent_Declare(dbg_macro GIT_REPOSITORY https://github.com/sharkdp/dbg-macro)
FetchContent_MakeAvailable(dbg_macro)
add_executable ( ${PROJECT_NAME} main.cpp) # your source files goes here
target_link_libraries ( ${PROJECT_NAME} PRIVATE dbg_macro) # make dbg.h available
main.cpp
# include < dbg.h >
int main () {
dbg ( 42 , " hello world " , false );
return 0 ;
}
DBG_MACRO_DISABLE
para deshabilitar la macro dbg(…)
(es decir, para que no funcione).DBG_MACRO_NO_WARNING
para deshabilitar las advertencias "El encabezado 'dbg.h' está incluido en su base de código" .DBG_MACRO_FORCE_COLOR
para forzar la salida en color y omitir las comprobaciones de tty. Puede pasar varios argumentos a la macro dbg(…)
. La salida de dbg(x, y, z)
es la misma que la dbg(x); dbg(y); dbg(z);
:
dbg ( 42 , " hello world " , false );
Tenga en cuenta que debe incluir "comas desprotegidas" entre paréntesis:
dbg ( " a vector: " , (std::vector< int >{ 2 , 3 , 4 }));
Si desea formatear números enteros en representación hexadecimal, octal o binaria, simplemente puede envolverlos en dbg::hex(…)
, dbg::oct(…)
o dbg::bin(…)
:
const uint32_t secret = 12648430 ;
dbg (dbg::hex(secret));
dbg(…)
ya imprime el tipo de cada valor entre paréntesis (ver captura de pantalla arriba). Pero a veces simplemente desea imprimir un tipo (tal vez porque no tiene un valor para ese tipo). En este caso, puede utilizar el asistente dbg::type<T>()
para imprimir de forma bonita un tipo T
determinado. Por ejemplo:
template < typename T>
void my_function_template () {
using MyDependentType = typename std::remove_reference<T>::type&&;
dbg (dbg::type<MyDependentType>());
}
Para imprimir una marca de tiempo, puede utilizar el asistente dbg::time()
:
dbg (dbg::time());
Si desea que dbg(…)
funcione para su tipo de datos personalizado, simplemente puede sobrecargar operator<<
para std::ostream&
:
std::ostream& operator <<(std::ostream& out, const user_defined_type& v) {
out << " … " ;
return out;
}
Si desea modificar el nombre del tipo que imprime dbg(…)
, puede agregar una sobrecarga personalizada get_type_name
:
// Customization point for type information
namespace dbg {
std::string get_type_name (type_tag< bool >) {
return " truth value " ;
}
}
Si desea contribuir a dbg-macro
, así es como puede crear las pruebas y demostraciones:
Asegúrese de que los submódulos estén actualizados:
git submodule update --init
Luego, utilice el flujo de trabajo típico cmake
. El uso de -DCMAKE_CXX_STANDARD=17
es opcional, pero se recomienda para tener habilitado el mayor conjunto de funciones:
mkdir build
cd build
cmake .. -DCMAKE_CXX_STANDARD=17
make
Para ejecutar las pruebas, simplemente llame:
make test
Puede encontrar las pruebas unitarias en tests/basic.cpp
.
Este proyecto está inspirado en la macro Rusts dbg!(…)
.