dbg(…)
Макрос для любителей отладки в стиле printf
.
Отладчики — это здорово. Но иногда у вас просто нет времени или терпения, чтобы все правильно настроить, и вам просто нужен быстрый способ проверить некоторые значения во время выполнения.
Этот проект предоставляет один заголовочный файл с макросом dbg(…)
, который можно использовать во всех обстоятельствах, когда вы обычно пишете printf("…", …)
или std::cout << …
. Но он имеет несколько дополнений.
# 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 ;
}
Приведенный выше код выдает следующий результат (попробуйте сами):
std::optional
и т. д.dbg.h
при включении выдает предупреждение компилятора (поэтому не забудьте его удалить). Чтобы это было практично, заголовок dbg.h
должен быть легко доступен из самых разных мест и во всех средах. Быстрый и грязный способ — скопировать файл заголовка в /usr/local/include
или клонировать репозиторий и создать символическую ссылку dbg.h
на /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
Если вы не хотите вносить неотслеживаемые изменения в свою файловую систему, проверьте ниже, существует ли пакет для вашей операционной системы или менеджера пакетов.
Вы можете установить dbg-macro
из AUR:
yay -S dbg-macro
Вы можете установить порт dbg-macro
через:
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
, чтобы отключить макрос dbg(…)
(т.е. сделать его неактивным).DBG_MACRO_NO_WARNING
, чтобы отключить предупреждения «заголовок dbg.h включен в вашу базу кода» .DBG_MACRO_FORCE_COLOR
, чтобы принудительно отображать цветной вывод и пропускать проверки tty. Вы можете передать несколько аргументов макросу dbg(…)
. Вывод dbg(x, y, z)
такой же, как и dbg(x); dbg(y); dbg(z);
:
dbg ( 42 , " hello world " , false );
Обратите внимание, что вам необходимо заключить «незащищенные запятые» в круглые скобки:
dbg ( " a vector: " , (std::vector< int >{ 2 , 3 , 4 }));
Если вы хотите отформатировать целые числа в шестнадцатеричном, восьмеричном или двоичном представлении, вы можете просто обернуть их в dbg::hex(…)
, dbg::oct(…)
или dbg::bin(…)
:
const uint32_t secret = 12648430 ;
dbg (dbg::hex(secret));
dbg(…)
уже печатает тип для каждого значения в скобках (см. снимок экрана выше). Но иногда вам просто нужно напечатать тип (возможно, потому, что у вас нет значения для этого типа). В этом случае вы можете использовать помощник dbg::type<T>()
для красивой печати заданного типа T
Например:
template < typename T>
void my_function_template () {
using MyDependentType = typename std::remove_reference<T>::type&&;
dbg (dbg::type<MyDependentType>());
}
Чтобы распечатать временную метку, вы можете использовать помощник dbg::time()
:
dbg (dbg::time());
Если вы хотите, чтобы dbg(…)
работал с вашим пользовательским типом данных, вы можете просто перегрузить operator<<
для std::ostream&
:
std::ostream& operator <<(std::ostream& out, const user_defined_type& v) {
out << " … " ;
return out;
}
Если вы хотите изменить имя типа, которое выводит dbg(…)
, вы можете добавить собственную перегрузку get_type_name
:
// Customization point for type information
namespace dbg {
std::string get_type_name (type_tag< bool >) {
return " truth value " ;
}
}
Если вы хотите внести свой вклад в dbg-macro
, вот как вы можете создавать тесты и демо-версии:
Убедитесь, что субмодули обновлены:
git submodule update --init
Затем используйте типичный рабочий процесс cmake
. Использование -DCMAKE_CXX_STANDARD=17
не является обязательным, но рекомендуется для включения максимального набора функций:
mkdir build
cd build
cmake .. -DCMAKE_CXX_STANDARD=17
make
Чтобы запустить тесты, просто вызовите:
make test
Вы можете найти модульные тесты в tests/basic.cpp
.
Этот проект вдохновлен макросом Rusts dbg!(…)
.