यह क्या है (( ))?


90

Gcc संकलक स्रोत कोड (gcc / c-family / c-pragma.c) के माध्यम से ब्राउज़ करते समय मैं देखता हूं:

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

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


और यह क्या है GTY? यह भाषा के मानक में परिभाषित नहीं है। अपना कोड देखें।
अलेक्सी फ्रुंज़े

7
GTY एक मैक्रो है ???
अंशुल

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

जवाबों:


81

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

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

अद्यतन :: जैसा कि एक टिप्पणी में ड्रू डॉर्मन द्वारा बताया गया है , वास्तविक डबल कोष्ठक GNU कार्यान्वयन के "आंतरिकता" का हिस्सा नहीं है; वे आमतौर पर तब उपयोग किए जाते हैं जब आप तर्कों की पूरी सूची को एकल मैक्रो के लिए एक तर्क में एकत्र करना चाहते हैं। यह कभी-कभी printf(), उदाहरण के लिए , लपेटते समय भी उपयोगी हो सकता है। इस तकनीक पर अधिक जानकारी के लिए यह प्रश्न देखें


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

30
(())खुद gcc मैजिक नहीं है। यह एक पाठ की अनुमति देता है जिसमें एक तर्क के रूप में अल्पविराम को मैक्रो में पारित किया जाना शामिल है। किसी भी C / C ++ कंपाइलर के लिए।
आकर्षित डोरमैन

45

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

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


2
क्या आप बता सकते हैं कि किसी को ऐसी कॉल का इस्तेमाल क्यों करना चाहिए?
स्वैचर

5
जैसे #define PRINT_A_LOT(a,b) printf("prefix\n"); printf a; printf("infix\n"); printf b; printf("suffix\n");(C ++ में मैक्रो की तुलना में अच्छे समाधान हैं, निश्चित रूप से)।
एमएसल्टर्स

@ अल्बर्टस: भी अच्छा होगा, यदि आप किसी मैक्रो को टेम्प्लेट पास करते हैं Macro((Pair<int, int>), ...)। हालाँकि तब आप अतिरिक्त परेशानी में होते हैं, मैक्रो के भीतर कोष्ठक से छुटकारा पा
लेते हैं
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.