GCC 7.3 - 3.10.5. Self-Referential Macros

3.10.5 सेल्फ रेफ़रेंशियल मैक्रोज़




gcc

3.10.5 सेल्फ रेफ़रेंशियल मैक्रोज़

एक सेल्फ रेफ़रेंशियल मैक्रो वह है जिसका नाम इसकी परिभाषा में दिखाई देता है। याद रखें कि सभी मैक्रो परिभाषाओं को बदलने के लिए अधिक मैक्रो के लिए बचाया जाता है। यदि स्व-संदर्भ को मैक्रो का उपयोग माना जाता है, तो यह असीम रूप से बड़े विस्तार का उत्पादन करेगा। इसे रोकने के लिए, स्व-संदर्भ को मैक्रो कॉल नहीं माना जाता है। यह प्रीप्रोसेसर आउटपुट में अपरिवर्तित है। एक उदाहरण पर विचार करें:

#define foo (4 + foo)

जहाँ foo आपके प्रोग्राम का एक वेरिएबल है।

सामान्य नियमों का पालन करते हुए, foo प्रत्येक संदर्भ (4 + foo) में विस्तार होगा; तब इसे बचाया जाएगा और (4 + (4 + foo)) में विस्तारित किया जाएगा; और इसी तरह जब तक कि कंप्यूटर मेमोरी से बाहर नहीं चला जाता है।

स्व-संदर्भ नियम एक कदम (4 + foo) बाद इस प्रक्रिया को छोटा कर देता है। इसलिए, इस स्थूल परिभाषा का संभवतः उपयोगी प्रभाव पड़ता है, जिससे प्रोग्राम को foo के मूल्य में 4 को जोड़ने का कारण बनता है, जहां से foo को संदर्भित किया जाता है।

ज्यादातर मामलों में, इस सुविधा का लाभ उठाना एक बुरा विचार है। प्रोग्राम पढ़ने वाला व्यक्ति जो देखता है कि foo एक चर है, यह उम्मीद नहीं करेगा कि यह एक मैक्रो भी है। पाठक कार्यक्रम में पहचानकर्ता foo में आ जाएगा और सोचता है कि इसका मूल्य चर foo का होना चाहिए, जबकि वास्तव में मूल्य चार से अधिक है।

स्व-संदर्भ का एक सामान्य, उपयोगी उपयोग एक मैक्रो बनाने के लिए है जो खुद को फैलता है। अगर आप लिखेंगे

#define EPERM EPERM

तब मैक्रो EPERM फैलता है। प्रभावी रूप से, इसे प्रीप्रोसेसर द्वारा अकेले छोड़ दिया जाता है जब भी इसे पाठ चलाने में उपयोग किया जाता है। आप बता सकते हैं कि यह ' #ifdef ' के साथ एक मैक्रो है। आप ऐसा कर सकते हैं यदि आप सांख्यिक रूप से संख्यात्मक स्थिरांक को परिभाषित करना चाहते हैं, लेकिन ' #ifdef ' प्रत्येक स्थिरांक के लिए सही है।

यदि एक मैक्रो x एक मैक्रो y का उपयोग करने का विस्तार करता है, और y का विस्तार मैक्रो x को संदर्भित करता है, तो यह x का एक अप्रत्यक्ष आत्म-संदर्भ है। इस मामले में x का विस्तार नहीं है। इस प्रकार, अगर हमारे पास है

#define x (4 + y)
#define y (2 * x)

फिर x और y विस्तार इस प्रकार है:

x    → (4 + y)
     → (4 + (2 * x))

y    → (2 * x)
     → (2 * (4 + y))

प्रत्येक मैक्रो का विस्तार तब होता है जब वह अन्य मैक्रो की परिभाषा में प्रकट होता है, लेकिन तब नहीं जब यह अप्रत्यक्ष रूप से अपनी परिभाषा में प्रकट होता है।

अगला: तर्क प्रेस्कैन , पिछला: साइड इफेक्ट्स का दोहराव , ऊपर: मैक्रो नुकसान [ Contents ] [ Index ]