C++ मैक्रोज़ में अर्थहीन do-while और if-else का उपयोग क्यों किया जाता है?
सभी को नमस्कार! मैं लगभग छह महीने से 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
int a = 5;
if (a > 0)
BAD