Avatar ·

لماذا تُستخدم حلقات do-while و if-else غير المجدية في ماكرو C++؟

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