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!(…)
الماكرو.