इस खंड में हम देखेंगे कि सी में मैक्रोज़ और फ़ंक्शंस के बीच अंतर क्या हैं। मैक्रोज़ पूर्व-संसाधित हैं, इसलिए इसका मतलब है कि सभी मैक्रोज़ को संकलित करते समय प्रीप्रोसेस किया जाएगा। फ़ंक्शंस पूर्व-संसाधित नहीं हैं, लेकिन संकलित हैं।
मैक्रोज़ में किसी प्रकार की जाँच नहीं की जाती है, इसलिए विभिन्न प्रकार के इनपुट के लिए कुछ समस्याएँ हो सकती हैं। कार्यों के मामले में, ऐसा नहीं किया जाता है। इसके अलावा मैक्रोज़ के लिए यदि इनपुट ठीक से बनाए नहीं रखा जाता है, तो यह कुछ अमान्य परिणाम उत्पन्न कर सकता है। समस्या के बारे में विचार प्राप्त करने के लिए कृपया निम्न प्रोग्राम देखें।
उदाहरण
#include <stdio.h> #define SQUARE(x) x * x int sqr(int x) { return x*x; } main() { printf("Use of sqr(). The value of sqr(3+2): %d\n", sqr(3+2)); printf("Use of SQUARE(). The value of SQUARE(3+2): %d", SQUARE(3+2)); }
आउटपुट
Use of sqr(). The value of sqr(3+2): 25 Use of SQUARE(). The value of SQUARE(3+2): 11
फ़ंक्शन और मैक्रो, हम चाहते हैं कि दोनों एक ही कार्य करेंगे, लेकिन यहां हम देख सकते हैं कि आउटपुट समान नहीं हैं। मुख्य कारण यह है कि जब हम 3 + 2 को फ़ंक्शन तर्क के रूप में पास कर रहे हैं, तो यह 5 में परिवर्तित हो जाता है, फिर 5 * 5 =25 की गणना करें। मैक्रो के लिए यह 3 + 2 * 3 + 2 =3 + 6 + 2 =11 कर रहा है।पी>
इसलिए निम्न समस्याओं के लिए मैक्रोज़ की अनुशंसा नहीं की जाती है -
-
कोई प्रकार की जाँच नहीं है
-
डिबग करने के लिए डिफ़ॉल्ट, क्योंकि वे सरल प्रतिस्थापन का कारण बनते हैं
-
मैक्रो में नेमस्पेस नहीं है। इसलिए यदि मैक्रो को एक सेक्शन में परिभाषित किया गया है, तो इसे दूसरे सेक्शन में इस्तेमाल किया जा सकता है।
-
मैक्रो कोड की लंबाई बढ़ाता है क्योंकि इसे प्रीप्रोसेसिंग के दौरान कोड से पहले जोड़ा जाता है।
-
मैक्रो किसी भी संकलन समय त्रुटियों की जाँच नहीं करता है।