2010-10-09 8 views
6

सी में अगर मैं एक struct/संघ/enum की घोषणा:टाइपपीफ बनाम स्ट्रक्चर/यूनियन/एनम के पीछे तर्क क्या है, क्या केवल एक नामस्थान नहीं हो सकता है?

struct Foo { int i ... } 

जब मैं अपने संरचना का उपयोग करने मैं टैग निर्दिष्ट करने की आवश्यकता हैं:

struct Foo foo; 

इस आवश्यकता को ढीला करने के लिए, मैं करने के लिए है उर्फ मेरी संरचना typedef का उपयोग कर:

typedef struct Foo Foo; 

क्यों सभी प्रकार/structs नहीं/एक ही डिफ़ॉल्ट रूप से "नाम स्थान" में जो कुछ भी? प्रत्येक परिवर्तनीय घोषणा पर घोषणा टैग की आवश्यकता के निर्णय के पीछे तर्क क्या है (जब तक टाइपडेफ़ेड नहीं हो) ???

कई अन्य भाषाएं इस भेद को नहीं बनाती हैं, और ऐसा लगता है कि यह केवल जटिलता आईएमएचओ का एक अतिरिक्त स्तर ला रहा है।

+0

जगह के बारे में '#define LPFOO * FOO' से अधिक जटिल नहीं :(हालांकि, अधिकांश कोड में मैंने संरचना फू और फू को अलग-अलग नाम दिए हैं (उदाहरण के लिए Foo_t और Foo या आपके पास क्या है) भले ही वे संकलक के लिए अलग-अलग 'नेमस्पेस' में हैं। –

+0

क्या आप कृपया उल्लेख कर सकते हैं कि सी ++ को छोड़कर "अन्य भाषाएं" क्या हैं? – Arun

+0

@ अरुण: सी # और जावा अपने प्रकार को "अलग टैग नेमस्पेस" में नहीं डालते हैं (लेकिन वे अंदर हो सकते हैं ग्लोबल नेमस्पेस समेत एक वास्तविक नेमस्पेस, जो सी) – paercebal

उत्तर

2

संरचनाओं/रिकॉर्ड बी के लिए बहुत शुरुआती प्री-सी थे, डेनिस रिची ने मूल 'टाइप' संरचना को जोड़ने के बाद ही। मुझे विश्वास है कि मूल struct वाक्य रचना सब पर एक टैग नहीं था, हर चर के लिए आपके द्वारा किए गए एक गुमनाम struct:

struct { 
    int i; 
    char a[5]; 
} s; 

बाद में, टैग संरचना लेआउट का पुन: उपयोग को सक्षम करने के लिए जोड़ा गया था, लेकिन यह वास्तव में नहीं था असली 'प्रकार' के रूप में माना जाता है।इसके अलावा, struct/union को दूर करने के लिए असंभव को पार्स होगा:

/* is Foo a union or a struct? */ 
Foo { int i; double x; }; 
Foo s; 

या 'घोषणा वाक्य रचना की नकल करता है अभिव्यक्ति वाक्य रचना' प्रतिमान कि इतने सी

मुझे लगता है कि typedef ज्यादा जोड़ा गया है के लिए मौलिक है तोड़ने बाद में, सी

के 'जन्म' के कुछ साल बाद तर्क "सी उस समय उच्चतम स्तर की भाषा थी।" सच नहीं लगता है। Algol-68 इसे पूर्ववत करता है और रिकॉर्ड उचित प्रकार के रूप में है। पास्कल के लिए भी यही है।

यदि आप सी के इतिहास के बारे में अधिक जानना चाहते हैं तो आपको रिची के "The Development of the C Language" एक दिलचस्प पढ़ा जा सकता है।

+0

मुझे वास्तव में यह नहीं पता है कि इस सवाल के साथ क्या करना है। ओपी पूछता है कि वीए घोषित करते समय उन्हें 'फू फू' के बजाय 'स्ट्रक्चर फू फू' कहने की ज़रूरत क्यों है तर्कसंगत, प्रकार को परिभाषित नहीं। – detly

+0

@detly: मैं कुछ संदर्भ प्रदान करना चाहता था, लेकिन मैं इस बिंदु पर और अधिक हो सकता था: * क्योंकि टैग वास्तविक प्रकार के रूप में शुरू नहीं हुए थे और यह सुनिश्चित करने के लिए कि 'घोषणा वाक्यविन्यास नकल अभिव्यक्ति वाक्यविन्यास' संभव है। * – schot

+0

ठीक है, जो अधिक समझ में आता है। मैं वास्तव में सूचक घोषणाओं से परे 'घोषणा वाक्यविन्यास नकल अभिव्यक्ति वाक्यविन्यास' नियम के बारे में कभी नहीं सोचता। – detly

0

अच्छी तरह से, अन्य भाषाएं आमतौर पर नामस्थानों का समर्थन करती हैं। सी नहीं करता है।

शायद यह कारण नहीं है, लेकिन कम से कम इस प्राकृतिक नामस्थान को समझ में आता है।

0

दिलचस्प सवाल! मेरे विचार यहाँ हैं।

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

सोचें कि, उस समय, एक नए प्लेटफॉर्म पर सिस्टम को पोर्ट करने के लिए प्लेटफार्म की असेंबली भाषा में घटकों को फिर से लिखना और अनुकूल करना था। सी की रिहाई के साथ, यह अंततः सी कंपाइलर को पोर्ट करने और मौजूदा कोड को पुन: संकलित करने के लिए नीचे आया।

यह शायद एक संपत्ति थी, तब भाषा के बहुत ही वाक्यविन्यास ने आपको उन रजिस्टरों के बीच अंतर करने के लिए मजबूर कर दिया जो एक रजिस्टर में फिट हो सकते थे, और वे प्रकार जो नहीं कर सके।

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

हम इस तरह की चीजों से घिरे हुए हैं। मेरा मतलब है, अपने कीबोर्ड पर एक नज़र डालें: हम एक PAUSE/BREAK कुंजी क्यों देते हैं? मुझे नहीं लगता कि मैंने वर्षों से उस कुंजी को दबाया है।

यह उस समय से विरासत है जिसमें यह समझ में आया है।

+0

द्वारा पेश किए गए टैग नेमस्पेस से थोड़ा अलग है, मैंने नियमित रूप से अपना PAUSE/BREAK कुंजी मारा। मेरे लिए सबसे आम उपयोग संकलन में बाधा डालना, या टूटना है डीबगर – mrduclaw

संबंधित मुद्दे