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
如果您不想對檔案系統進行未追蹤的更改,請檢查下面是否有適合您的作業系統或套件管理器的套件。
您可以從 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 }));
如果你想以十六進位、八進位或二進位表示形式格式化整數,你可以簡單地將它們包裝在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!(…)
宏。