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