Avatar ·

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; ``` कंपाइलर ने त्रुटि दी या अजीब व्यवहार किया। क्या आप समझा सकते हैं?