GCC 7.3 - 3.3. Macro Arguments

3.3 मैक्रो तर्क




gcc

3.3 मैक्रो तर्क

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

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

एक उदाहरण के रूप में, यहां एक मैक्रो है जो न्यूनतम दो संख्यात्मक मानों की गणना करता है, क्योंकि यह कई सी कार्यक्रमों में परिभाषित किया गया है, और कुछ उपयोग करता है।

#define min(X, Y)  ((X) < (Y) ? (X) : (Y))
  x = min(a, b);          →  x = ((a) < (b) ? (a) : (b));
  y = min(1, 2);          →  y = ((1) < (2) ? (1) : (2));
  z = min(a + 28, *p);    →  z = ((a + 28) < (*p) ? (a + 28) : (*p));

(इस छोटे से उदाहरण में आप पहले से ही मैक्रो तर्कों के खतरों को देख सकते हैं। विस्तृत विवरण के लिए मैक्रो पॉटेफल्स देखें।)

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

macro (array[x = y, x + 1])

macro लिए दो तर्क देता है: array[x = y और x + 1] । यदि आप एक तर्क के रूप में array[x = y, x + 1] आपूर्ति करना चाहते हैं, तो आप इसे array[(x = y, x + 1)] रूप में लिख सकते हैं, जो कि C कोड के बराबर है।

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

उदाहरण के लिए, min (min (a, b), c) का विस्तार किया जाता है

min (((a) < (b) ? (a) : (b)), (c))

और फिर करने के लिए

((((a) < (b) ? (a) : (b))) < (c)
 ? (((a) < (b) ? (a) : (b)))
 : (c))

(स्पष्टता के लिए यहां दिखाए गए लाइन ब्रेक वास्तव में उत्पन्न नहीं होंगे।)

आप मैक्रो तर्कों को खाली छोड़ सकते हैं; यह प्रीप्रोसेसर के लिए कोई त्रुटि नहीं है (लेकिन कई मैक्रोज़ फिर अमान्य कोड तक विस्तारित होंगे)। आप पूरी तरह से तर्क नहीं छोड़ सकते; यदि कोई मैक्रो दो तर्क देता है, तो उसकी तर्क सूची के शीर्ष स्तर पर ठीक एक कॉमा होना चाहिए। यहाँ min का उपयोग कर कुछ मूर्खतापूर्ण उदाहरण हैं:

min(, b)        → ((   ) < (b) ? (   ) : (b))
min(a, )        → ((a  ) < ( ) ? (a  ) : ( ))
min(,)          → ((   ) < ( ) ? (   ) : ( ))
min((,),)       → (((,)) < ( ) ? ((,)) : ( ))

min()      error→ macro "min" requires 2 arguments, but only 1 given
min(,,)    error→ macro "min" passed 3 arguments, but takes just 2

व्हॉट्सएप एक प्रीप्रोसेसिंग टोकन नहीं है, इसलिए यदि कोई मैक्रो foo एक तर्क लेता है, तो foo () और foo ( ) दोनों एक खाली तर्क देते हैं। पिछले GNU प्रीप्रोसेसर कार्यान्वयन और दस्तावेज़ीकरण इस बिंदु पर गलत थे, जिसमें कहा गया था कि एक फ़ंक्शन-मैक्रो जो एकल तर्क लेता है, यदि रिक्त तर्क की आवश्यकता होती है, तो इसे एक स्थान दिया जाएगा।

स्ट्रिंग लिटरल्स के अंदर दिखने वाले मैक्रो मापदंडों को उनके संबंधित वास्तविक तर्कों द्वारा प्रतिस्थापित नहीं किया जाता है।

#define foo(x) x, "x"
foo(bar)        → bar, "x"

अगला: Stringizing , पिछला: फ़ंक्शन-जैसे मैक्रोज़ , अप: Macros [ Contents ] [ Index ]