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-macrodbg-macroポートは次のようにインストールできます。
vcpkg install dbg-macroCMakeLists.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!(…)マクロからインスピレーションを受けています。