dbg(…)
printf
スタイルのデバッグファンのためのマクロ。
デバッガは素晴らしいです。しかし、すべてを正しく設定する時間や忍耐力がなく、実行時にいくつかの値を簡単に検査する方法が必要な場合もあります。
このプロジェクトは、通常printf("…", …)
またはstd::cout << …
を記述するあらゆる状況で使用できるdbg(…)
マクロを含む単一のヘッダー ファイルを提供します。ただし、いくつかの追加機能が付属しています。
# 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
ファイルシステムに追跡されない変更を加えたくない場合は、オペレーティング システムまたはパッケージ マネージャー用のパッケージがあるかどうかを以下で確認してください。
AUR からdbg-macro
をインストールできます。
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 }));
整数を 16 進数、8 進数、または 2 進数表現でフォーマットしたい場合は、それらを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(…)
カスタム データ型で機能させたい場合は、単にstd::ostream&
のoperator<<
をオーバーロードできます。
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!(…)
マクロからインスピレーションを受けています。