अपने प्रश्नों का उत्तर देने के लिए, इस बारे में सोचें कि मुख्य रूप से मैक्रोज़ का क्या उपयोग किया जाता है (चेतावनी: मस्तिष्क-संकलित कोड)।
- मैक्रों प्रतीकात्मक स्थिरांक को परिभाषित करते थे
#define X 100
इसे आसानी से बदला जा सकता है: const int X = 100;
- मैक्रोज़ (अनिवार्य रूप से) इनलाइन प्रकार-अज्ञेय कार्यों को परिभाषित करने के लिए उपयोग किया जाता है
#define max(X,Y) (X>Y?X:Y)
फ़ंक्शन ओवरलोडिंग का समर्थन करने वाली किसी भी भाषा में, यह एक सामान्य कार्य द्वारा, सही प्रकार के अतिभारित कार्यों के द्वारा, या, एक भाषा में, जो कि जेनरिक का समर्थन करता है, का अनुकरण किया जा सकता है। मैक्रो खुशी से कुछ बिंदुओं या तारों सहित तुलना करने का प्रयास करेगा , जो संकलन कर सकता है, लेकिन लगभग निश्चित रूप से वह नहीं है जो आप चाहते थे। दूसरी ओर, यदि आपने मैक्रोज़ को सुरक्षित बनाया है, तो वे ओवरलोड कार्यों के लिए कोई लाभ या सुविधा प्रदान नहीं करते हैं।
- मैक्रोज़ अक्सर उपयोग किए जाने वाले तत्वों के लिए शॉर्टकट निर्दिष्ट करते थे।
#define p printf
यह आसानी से एक फ़ंक्शन द्वारा प्रतिस्थापित किया जाता p()
है जो समान कार्य करता है। यह सी ( va_arg()
कार्यों के परिवार का उपयोग करने की आवश्यकता) में काफी शामिल है, लेकिन कई अन्य भाषाओं में जो फ़ंक्शन तर्कों की चर संख्या का समर्थन करते हैं, यह बहुत सरल है।
एक विशेष मैक्रो भाषा के बजाय एक भाषा के भीतर इन सुविधाओं का समर्थन करना सरल है, कम त्रुटि प्रवण और कोड पढ़ने वाले अन्य लोगों के लिए बहुत कम भ्रमित करना। वास्तव में, मैं मैक्रो के लिए एक भी उपयोग-केस के बारे में नहीं सोच सकता हूं जो आसानी से दूसरे तरीके से नकल नहीं कर सकता है। केवल जगह है जहाँ मैक्रो सही मायने में उपयोगी होते हैं जब वे की तरह सशर्त संकलन निर्माणों से बंधा रहे हैं #if
(आदि)।
उस बिंदु पर, मैं आपके साथ बहस नहीं करूंगा, क्योंकि मेरा मानना है कि लोकप्रिय भाषाओं में सशर्त संकलन के गैर-प्रीप्रोसेसर समाधान बेहद बोझिल हैं (जैसे जावा में बायटेकोड इंजेक्शन)। लेकिन डी जैसी भाषाएं ऐसे समाधानों के साथ आई हैं जिनमें प्रीप्रोसेसर की आवश्यकता नहीं होती है और प्रीप्रोसेसर शर्तों का उपयोग करने की तुलना में अधिक बोझिल नहीं होते हैं, जबकि कहीं कम त्रुटि वाले होते हैं।