कई स्पष्टीकरण। पहला आम है, दूसरा एक पैरामीटर के साथ C प्रीप्रोसेसर मैक्रोज़ के लिए विशिष्ट है:
प्रवाह नियंत्रण
मैंने इसे सादे C कोड में उपयोग किया है। मूल रूप से, यह गोटो का एक सुरक्षित संस्करण है, क्योंकि आप इससे बाहर निकल सकते हैं और सभी मेमोरी ठीक से साफ हो जाती है।
कुछ goto- कुछ अच्छा क्यों होगा ? ठीक है, अगर आपके पास कोड है जहां बहुत अधिक हर पंक्ति एक त्रुटि वापस कर सकती है, लेकिन आपको उन सभी को उसी तरह से प्रतिक्रिया करने की आवश्यकता है (जैसे कि सफाई के बाद अपने कॉलर को त्रुटि सौंपकर), यह आमतौर पर एक से बचने के लिए अधिक पठनीय हैif( error ) { /* cleanup and error string generation and return here */ } के रूप में यह साफ-सफाई कोड के दोहराव से बचा जाता है।
हालाँकि, C ++ में आपके पास इस उद्देश्य के लिए अपवाद + RAII है, इसलिए मैं इसे खराब कोडिंग शैली मानूंगा।
अर्धविराम की जाँच
यदि आप फ़ंक्शन-जैसे मैक्रो इनवोकेशन के बाद अर्धविराम भूल जाते हैं, तो तर्क अवांछित तरीके से अनुबंध कर सकते हैं और मान्य सिंटैक्स में संकलित कर सकते हैं। स्थूल की कल्पना करो
#define PRINT_IF_DEBUGMODE_ON(msg) if( gDebugModeOn ) printf("foo");
जिसे गलती से कहा जाता है
if( foo )
PRINT_IF_DEBUGMODE_ON("Hullo\n")
else
doSomethingElse();
"और" के साथ संबद्ध माना जाएगा gDebugModeOn, इसलिए जब fooहैfalse , तो इसका ठीक उल्टा मतलब होगा।
अस्थायी चरों के लिए एक गुंजाइश प्रदान करना।
चूंकि कर्ली ब्रेसिज़ हैं / जबकि, अस्थायी चर में स्पष्ट रूप से परिभाषित गुंजाइश है जो वे बच नहीं सकते हैं।
"संभवतः अवांछित अर्धविराम" चेतावनी से बचना
कुछ मैक्रोज़ केवल डीबग बिल्ड में सक्रिय होते हैं। आप उन्हें परिभाषित करते हैं:
#if DEBUG
#define DBG_PRINT_NUM(n) printf("%d\n",n);
#else
#define DBG_PRINT_NUM(n)
#endif
अब यदि आप एक सशर्त के अंदर रिलीज बिल्ड में इसका उपयोग करते हैं, तो यह संकलन करता है
if( foo )
;
कई कंपाइलर इसे ऐसे ही देखते हैं
if( foo );
जो अकस्मात गलती से लिखा जाता है। तो आपको एक चेतावनी मिलती है। Do {} जबकि (झूठा) इसे संकलक से छुपाता है, और इसे एक संकेत के रूप में स्वीकार किया जाता है कि आप वास्तव में यहां कुछ नहीं करना चाहते हैं।
सशर्त द्वारा लाइनों पर कब्जा करने से बचना
पिछले उदाहरण से मैक्रो:
if( foo )
DBG_PRINT_NUM(42)
doSomething();
अब, एक डिबग बिल्ड में, चूंकि हमने आदतन अर्धविराम को भी शामिल किया है, यह ठीक संकलन करता है। हालाँकि, रिलीज़ बिल्ड में यह अचानक बदल जाता है:
if( foo )
doSomething();
या अधिक स्पष्ट रूप से स्वरूपित
if( foo )
doSomething();
जो बिल्कुल नहीं था, जो इरादा था। मैक्रो के चारों ओर {...} करते हुए (अनुपलब्ध) अनुपलब्ध अर्धविराम को संकलित त्रुटि में बदल देता है।
ओपी के लिए इसका क्या मतलब है?
सामान्य तौर पर, आप त्रुटि से निपटने के लिए C ++ में अपवादों का उपयोग करना चाहते हैं, और मैक्रोज़ के बजाय टेम्पलेट। हालांकि, बहुत दुर्लभ मामले में जहां आपको अभी भी मैक्रोज़ की जरूरत है (जैसे कि टोकन चिपकाने का उपयोग करके वर्ग के नाम उत्पन्न करते समय) या सादे सी तक सीमित हैं, यह एक उपयोगी पैटर्न है।