لماذا تُستخدم حلقات 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;
```
أصدر المترجم خطأً أو سلوكًا غريبًا. هل يمكنك التوضيح؟