GCC 7.4 - 10.2. Traditional macros

10.2 पारंपरिक मैक्रोज़




gcc

10.2 पारंपरिक मैक्रोज़

पारंपरिक और आईएसओ मैक्रोज़ के बीच एक बड़ा अंतर यह है कि पूर्व में टोकन अनुक्रम के बजाय पाठ का विस्तार होता है। सीपीपी मैक्रो के प्रतिस्थापन पाठ से क्षैतिज व्हाट्सएप के सभी प्रमुख और अनुगामी को संग्रहीत करने से पहले हटा देता है, लेकिन आंतरिक व्हाट्सएप के रूप को संरक्षित करता है।

एक परिणाम यह है कि प्रतिस्थापन पाठ के लिए एक बेजोड़ उद्धरण ( पारंपरिक लेक्सिकल विश्लेषण देखें) के लिए वैध है। मैक्रो कॉल के बाद पाठ में एक बिना स्ट्रिंग या वर्ण स्थिर जारी रहता है। इसी तरह, एक मैक्रो के विस्तार के अंत में पाठ एकल टोकन का उत्पादन करने के लिए मैक्रो आह्वान के बाद पाठ के साथ मिलकर चल सकता है।

मैक्रो के विस्तार के बाद आम तौर पर प्रतिस्थापन पाठ से टिप्पणियां हटा दी जाती हैं, लेकिन अगर -CC विकल्प को कमांड-लाइन टिप्पणियों पर पारित किया जाता है, तो वे संरक्षित हैं। (वास्तव में, वर्तमान कार्यान्वयन मैक्रो रिप्लेसमेंट टेक्स्ट को सहेजने से पहले ही टिप्पणियों को हटा देता है, लेकिन यह इस तरह से करने के लिए सावधान है कि मनाया प्रभाव फ़ंक्शन जैसे मैक्रो मामले में भी समान है।)

आईएसओ स्ट्रिंगिंग ऑपरेटर ' # ' और टोकन पेस्ट ऑपरेटर ' ## ' का कोई विशेष अर्थ नहीं है। जैसा कि बाद में समझाया गया है, इन ऑपरेटरों के समान प्रभाव एक अलग तरीके से प्राप्त किया जा सकता है। मैक्रो नाम जो मुख्य फ़ाइल से या मैक्रो रिप्लेसमेंट के बाद उद्धरणों में एम्बेड किए जाते हैं, विस्तार नहीं करते हैं।

CPP अपने बदले हुए पाठ के साथ एक अनियोजित ऑब्जेक्ट की तरह मैक्रो नाम की जगह लेता है, और फिर इसे आगे मैक्रोज़ को बदलने के लिए बचाता है। मानक मैक्रो विस्तार के विपरीत, पारंपरिक मैक्रो विस्तार में पुनरावृत्ति को रोकने के लिए कोई प्रावधान नहीं है। यदि कोई ऑब्जेक्ट-जैसा मैक्रो अपने प्रतिस्थापन पाठ में अयोग्य दिखाई देता है, तो उसे पुन: पासिंग के दौरान बदल दिया जाएगा, और इसी तरह विज्ञापन infinitum पर । जीसीसी पता लगाता है कि जब यह पुनरावर्ती मैक्रोज़ का विस्तार कर रहा है, तो एक त्रुटि संदेश का उत्सर्जन करता है, और आक्रामक मैक्रो आह्वान के बाद भी जारी रहता है।

#define PLUS +
#define INC(x) PLUS+x
INC(foo);
     → ++foo;

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

यह कार्यान्वयन मैक्रो तर्कों से सभी टिप्पणियों को हटा देता है, जब तक कि -C विकल्प नहीं दिया जाता है। तर्कों में अन्य सभी क्षैतिज व्हाट्सएप का रूप संरक्षित है, जिसमें व्हाट्सएप प्रमुख और अनुगामी है। विशेष रूप से

f( )

एक एकल तर्क के साथ मैक्रो ' एफ ' के एक स्थान के एक एकल के रूप में माना जाता है। यदि आप फ़ंक्शन-जैसे मैक्रो को लागू करना चाहते हैं जो कोई तर्क नहीं लेता है, तो आपको कोष्ठक के बीच कोई व्हाट्सएप नहीं छोड़ना चाहिए।

यदि कोई मैक्रो तर्क एक नई लाइन को पार करता है, तो तर्क बनाते समय नई लाइन को एक स्थान से बदल दिया जाता है। यदि पिछली पंक्ति में एक अव्यक्त उद्धरण समाहित है, तो निम्न पंक्ति उद्धृत स्थिति को इनहेरिट करती है।

पारंपरिक प्रीप्रोसेसर प्रतिस्थापन पाठ में मापदंडों को उनके तर्कों के साथ प्रतिस्थापित करते हैं, भले ही पैरामीटर उद्धरण के भीतर हों या नहीं। यह तर्कों को कठोर करने का एक तरीका प्रदान करता है। उदाहरण के लिए

#define str(x) "x"
str(/* A comment */some text )
     → "some text "

ध्यान दें कि टिप्पणी हटा दी गई है, लेकिन अनुगामी स्थान संरक्षित है। टोकन चिपकाने के प्रभाव के लिए एक टिप्पणी का उपयोग करने का एक उदाहरण यहां दिया गया है।

#define suffix(x) foo_/**/x
suffix(bar)
     → foo_bar

अगला: पारंपरिक गर्भपात , पिछला: पारंपरिक शाब्दिक विश्लेषण , ऊपर: पारंपरिक मोड [ Contents ] [ Index ]