dbg(…)
Makro untuk penggemar debugging gaya printf
.
Debugger sangat bagus. Namun terkadang Anda tidak punya waktu atau kesabaran untuk menyiapkan semuanya dengan benar dan hanya ingin cara cepat untuk memeriksa beberapa nilai saat runtime.
Proyek ini menyediakan file header tunggal dengan makro dbg(…)
yang dapat digunakan dalam semua keadaan di mana Anda biasanya menulis printf("…", …)
atau std::cout << …
. Tapi itu datang dengan beberapa tambahan.
# 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 ;
}
Kode di atas menghasilkan output ini (coba sendiri):
std::optional
, dll.dbg.h
mengeluarkan peringatan kompiler saat disertakan (agar Anda tidak lupa menghapusnya). Untuk membuat hal ini praktis, header dbg.h
harus tersedia dari semua tempat berbeda dan di semua jenis lingkungan. Cara cepat & kotor adalah dengan menyalin file header ke /usr/local/include
atau mengkloning repositori dan symlink dbg.h
ke /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
Jika Anda tidak ingin membuat perubahan yang tidak terlacak pada sistem file Anda, periksa di bawah apakah ada paket untuk sistem operasi atau manajer paket Anda.
Anda dapat menginstal dbg-macro
dari AUR:
yay -S dbg-macro
Anda dapat menginstal port dbg-macro
melalui:
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
untuk menonaktifkan makro dbg(…)
(yaitu untuk menjadikannya larangan pengoperasian).DBG_MACRO_NO_WARNING
untuk menonaktifkan peringatan "'dbg.h' disertakan dalam basis kode Anda" .DBG_MACRO_FORCE_COLOR
untuk memaksa keluaran berwarna dan lewati pemeriksaan tty. Anda dapat meneruskan beberapa argumen ke makro dbg(…)
. Output dari dbg(x, y, z)
sama dengan dbg(x); dbg(y); dbg(z);
:
dbg ( 42 , " hello world " , false );
Perhatikan bahwa Anda harus membungkus "koma tanpa proteksi" dalam tanda kurung:
dbg ( " a vector: " , (std::vector< int >{ 2 , 3 , 4 }));
Jika Anda ingin memformat bilangan bulat dalam representasi heksadesimal, oktal, atau biner, Anda cukup membungkusnya dalam dbg::hex(…)
, dbg::oct(…)
atau dbg::bin(…)
:
const uint32_t secret = 12648430 ;
dbg (dbg::hex(secret));
dbg(…)
sudah mencetak tipe untuk setiap nilai dalam tanda kurung (lihat gambar di atas). Namun terkadang Anda hanya ingin mencetak suatu tipe (mungkin karena Anda tidak memiliki nilai untuk tipe tersebut). Dalam hal ini, Anda dapat menggunakan helper dbg::type<T>()
untuk mencetak tipe tertentu T
. Misalnya:
template < typename T>
void my_function_template () {
using MyDependentType = typename std::remove_reference<T>::type&&;
dbg (dbg::type<MyDependentType>());
}
Untuk mencetak stempel waktu, Anda dapat menggunakan bantuan dbg::time()
:
dbg (dbg::time());
Jika Anda ingin dbg(…)
berfungsi untuk tipe data khusus Anda, Anda cukup membebani operator<<
untuk std::ostream&
:
std::ostream& operator <<(std::ostream& out, const user_defined_type& v) {
out << " … " ;
return out;
}
Jika Anda ingin mengubah nama tipe yang dicetak oleh dbg(…)
, Anda dapat menambahkan kelebihan get_type_name
khusus:
// Customization point for type information
namespace dbg {
std::string get_type_name (type_tag< bool >) {
return " truth value " ;
}
}
Jika Anda ingin berkontribusi pada dbg-macro
, berikut cara membuat pengujian dan demo:
Pastikan submodulnya mutakhir:
git submodule update --init
Kemudian, gunakan alur kerja cmake
yang khas. Penggunaan -DCMAKE_CXX_STANDARD=17
bersifat opsional, namun direkomendasikan agar kumpulan fitur terbesar dapat diaktifkan:
mkdir build
cd build
cmake .. -DCMAKE_CXX_STANDARD=17
make
Untuk menjalankan tes, cukup panggil:
make test
Anda dapat menemukan pengujian unit di tests/basic.cpp
.
Proyek ini terinspirasi oleh makro Rusts dbg!(…)
.