2013-02-15 28 views
90

जबकि जीसीसी संकलक स्रोत कोड के माध्यम से ब्राउज़ (जीसीसी/सी-परिवार/सी-pragma.c) मैं देख रहा हूँ:यह क्या है (())?

typedef struct GTY(()) align_stack { 
    int     alignment; 
    tree     id; 
    struct align_stack * prev; 
} align_stack; 

और मेरे पीछे सी प्रोग्रामिंग साल के बहुत सारे होने की परवाह किए बिना, इन बिट्स: (()) हैं अभी तक मुझे पूरी तरह अज्ञात है। क्या कोई कृपया बता सकता है कि उनका क्या मतलब है? Google इसे नहीं ढूंढ रहा है।

+0

और यह 'जीटीई' क्या है? यह भाषा मानक में परिभाषित नहीं है। अपना कोड देखें –

+7

जीटीई एक मैक्रो है ??? – Anshul

+1

आप इसे क्वेरी स्ट्रिंग में साइट निर्दिष्ट करके Google पर पा सकते हैं: 'GTY साइट: gcc.gnu.org' – ericson

उत्तर

81

वे जीसीसी आंतरिक "जादू" हैं, यानी कंपाइलर कार्यान्वयन का हिस्सा स्वयं।

this page देखें जो उनके उपयोग के बारे में बात करता है। मैक्रो का उपयोग कचरा-संग्रह उद्देश्यों के लिए प्रकारों को चिह्नित करने के लिए किया जाता है। विवरण भी हो सकते हैं, विवरण के लिए this page देखें।

अद्यतन :: के रूप में एक टिप्पणी में Drew Dorman से कहा, वास्तविक डबल कोष्ठक जीएनयू कार्यान्वयन की "internalness" का हिस्सा नहीं हैं; जब आप कॉल किए गए मैक्रो के लिए एक तर्क में तर्कों की एक पूरी सूची एकत्र करना चाहते हैं तो उनका आमतौर पर उपयोग किया जाता है। कभी-कभी लपेटने पर यह उपयोगी हो सकता है उदा। printf() भी। See this question, for more on this technique

+11

आशा है कि थोड़ा और स्पष्टीकरण निम्नानुसार है .. – Krishnabhadra

+5

@ कृष्णाभद्र स्पष्टीकरण लिंक साइट पर पाया जा सकता है। जीटीवी-मार्कर आईएमओ से संबंधित जीसीसी सुविधाओं के बारे में और स्पष्टीकरण इस विशेष प्रश्न और उत्तर के दायरे से बाहर होगा। –

+29

'(()) 'स्वयं ** ** ** जीसीसी जादू नहीं है। यह एक पाठ की अनुमति देता है जिसमें एक ही तर्क के रूप में एक मैक्रो को अल्पविराम पारित किया जाता है। किसी भी सी/सी ++ कंपाइलर के लिए। –

45

सामान्यतः, इसका उपयोग ढाल कॉमा के लिए मैक्रोज़ के साथ किया जाता है। #define foo(a,b) दिया गया है, मैक्रो आमंत्रण foo(1,2,3) अवैध होगा। कोष्ठक की एक अतिरिक्त जोड़ी का उपयोग करके स्पष्ट किया गया है कि अल्पविराम किस प्रकार बचाया जाता है: foo((1,2),3) बनाम foo(1,(2,3))

इस मामले में, GTY अल्पविराम से अलग कई तर्क ले सकते हैं, लेकिन इन सभी कॉमा को संरक्षित किया जाना चाहिए। यही कारण है कि आंतरिक () सभी तर्कों को घेरे हुए हैं।

+2

क्या आप समझा सकते हैं कि किसी को ऐसे कॉल का उपयोग क्यों करना चाहिए? – swaechter

+5

ईजी। '# परिभाषित करें PRINT_A_LOT (ए, बी) printf (" उपसर्ग \ n "); printf ए; printf ("इन्फ़िक्स \ n"); printf बी; printf ("प्रत्यय \ n"); '(सी ++ में मैक्रो के मुकाबले अच्छे समाधान हैं)। – MSalters

+0

@ अल्बर्टस: यदि आप मैक्रो 'मैक्रो ((जोड़ी ) में टेम्पलेट पास करते हैं, तो भी अच्छा होगा, ...) '। हालांकि फिर आप मैक्रो के भीतर कोष्ठक से छुटकारा पाने के लिए अतिरिक्त परेशानी में भाग लेते हैं – BeniBela