Avatar ·

لماذا تُستخدم حلقات do-while و if-else التي لا معنى لها في ماكرو C++؟

مرحباً بالجميع! لقد كنت أكتب بلغة C++ لمدة نصف عام تقريباً وبدأت في فهم ماكرو المعالج المسبق. غالباً في كود الآخرين وفي ملفات الرأس النظامية (مثل Boost أو Qt) أرى ماكرو ملفوفة في تركيبات غريبة مثل `do { ... } while(0)` أو `if (1) { ... } else (void)0`. إليك مثال: ```cpp #define LOG_ERROR(msg) do { \ std::cerr << "ERROR: " << msg << std::endl; \ } while(0) #define SAFE_DELETE(p) if (p) { delete p; p = nullptr; } else (void)0 ``` للوهلة الأولى يبدو هذا غير منطقي تماماً: لماذا استخدام `do-while` الذي يتم تنفيذه مرة واحدة فقط بشكل مضمون؟ لماذا لا تكتب ببساطة كتلة كود داخل أقواس معقوفة؟ وما هذا `else (void)0` الغريب في نهاية الماكرو الثاني؟ حاولت كتابة الماكرو الخاص بي بدون هذه الأغلفة: ```cpp #define BAD_MACRO(x) \ int y = x * 2; \ std::cout << y << std::endl; ``` وواجهت مشكلة: إذا استخدمته في شرط `if`، فإن الكود يتصرف بشكل غير متوقع. على سبيل المثال: ```cpp