मैक्रोज़ (प्रीप्रोसेसर) और फंक्शन्स (कंपाइलर) में मूलभूत अंतर हैं जो कोड सहीता, डिबगिंग और प्रदर्शन को प्रभावित करते हैं।
तुलना तालिका
| पहलू | मैक्रोज़ (#define) | फंक्शन्स |
|---|---|---|
| प्रोसेसिंग | प्रीप्रोसेसिंग (टेक्स्ट रिप्लेसमेंट) | कंपाइलेशन (कोड जनरेशन) |
| टाइप चेकिंग | नहीं | हाँ |
| आर्गुमेंट इवैल्यूएशन | हर उपयोग पर (मल्टीपल इवैल्यूएशन संभव) | एक बार (कॉल पर) |
| स्कोप | फाइल-लेवल (नामस्पेस नहीं) | ब्लॉक/फाइल/नेमस्पेस स्कोप |
| डिबगिंग | कठिन (सिंबल टेबल में नहीं) | आसान (डिबगर में दिखते हैं) |
| कोड साइज | प्रत्येक उपयोग पर एक्सपैंड होता है | एक बार कंपाइल, कॉल ओवरहेड |
| रिकर्सन | नहीं | हाँ |
| एड्रेस ले सकते हैं? | नहीं | हाँ (फंक्शन पॉइंटर) |
क्लासिक समस्या: ऑपरेटर प्रेसिडेंस
#include <stdio.h>
#define SQUARE(x) x * x // खतरनाक: कोई पैरेंथेसिस नहीं
int sqr(int x) { return x * x; }
int main() {
printf("sqr(3+2) = %d\n", sqr(3+2)); // 25 ✓
printf("SQUARE(3+2) = %d\n", SQUARE(3+2)); // 11 ✗ (3+2*3+2 = 3+6+2)
return 0;
}
आउटपुट
sqr(3+2) = 25 SQUARE(3+2) = 11
सही मैक्रो परिभाषा
#define SQUARE(x) ((x) * (x)) // पैरेंथेसिस महत्वपूर्ण! #define MAX(a, b) ((a) > (b) ? (a) : (b))
कब मैक्रोज़ उपयोग करें
- कंपाइल-टाइम कॉन्स्टेंट्स (
#define MAX_SIZE 100)। - कंडीशनल कंपाइलेशन (
#ifdef DEBUG)। - जेनेरिक कोड जहां टेम्पलेट्स (C++) उपलब्ध नहीं।
- स्ट्रिंगिफिकेशन (
#x) / टोकन पेस्टिंग (##)।
आधुनिक विकल्प
- C++:
inlineफंक्शन्स,constexpr, टेम्पलेट्स। - C:
static inlineफंक्शन्स (C99),_Generic(C11)।