C++ मैक्रोज़ में अर्थहीन do-while और if-else का उपयोग क्यों किया जाता है?
नमस्ते! मैंने 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;
```
कंपाइलर ने त्रुटि दी या अजीब व्यवहार किया। क्या आप समझा सकते हैं?