यहां हम C में स्वच्छ मैक्रोज़ देखेंगे। हम C में मैक्रोज़ के उपयोग को जानते हैं। लेकिन कभी-कभी यह पहचानकर्ताओं के आकस्मिक कैप्चर के कारण वांछित परिणाम नहीं देता है।
यदि हम निम्नलिखित कोड देखते हैं, तो हम देख सकते हैं कि यह ठीक से काम नहीं कर रहा है।
उदाहरण
#include <stdio.h>
#define INCREMENT(i) do { int a = 0; ++i; } while(0)
int main(void) {
int a = 10, b = 20;
// मैक्रोज़ को a और b के लिए दो बार कॉल करें
INCREMENT(a);
INCREMENT(b);
printf("a = %d, b = %d\n", a, b);
}
प्रीप्रोसेसिंग के बाद कोड इस तरह होगा:
उदाहरण
#include <stdio.h>
#define INCREMENT(i) do { int a = 0; ++i; } while(0)
int main(void) {
int a = 10, b = 20;
// मैक्रोज़ को a और b के लिए दो बार कॉल करें
do { int a = 0; ++a; } while(0);
do { int a = 0; ++b; } while(0);
printf("a = %d, b = %d\n", a, b);
}
आउटपुट
a = 10, b = 21
यहां हम देख सकते हैं कि a के लिए मान अद्यतन नहीं हुआ है। इसलिए इस मामले में हम स्वच्छ मैक्रोज़ का उपयोग करेंगे। ये स्वच्छ मैक्रोज़ वे मैक्रोज़ हैं जिनके विस्तार की गारंटी है कि वे पहचानकर्ताओं का आकस्मिक कैप्चर नहीं बनाते हैं। यहां हम किसी ऐसे वेरिएबल नाम का उपयोग नहीं करेंगे जो विस्तार के तहत कोड के साथ हस्तक्षेप करने का जोखिम उठा सके। यहां एक अन्य वेरिएबल 't' का उपयोग मैक्रो के अंदर किया जाता है। यह प्रोग्राम में ही उपयोग नहीं किया जाता है।
उदाहरण
#include <stdio.h>
#define INCREMENT(i) do { int t = 0; ++i; } while(0)
int main(void) {
int a = 10, b = 20;
// मैक्रोज़ को a और b के लिए दो बार कॉल करें
INCREMENT(a);
INCREMENT(b);
printf("a = %d, b = %d\n", a, b);
}
आउटपुट
a = 11, b = 21