2010-12-08 19 views
5

में x_t मेरी हाल ही में ऑपरेटिंग सिस्टम कक्षा में बनाम हम इस तरह के रूप में परिभाषित किया वस्तुओं का एक समूह है।struct एक्स सी

सवाल यह है कि कभी-कभी दिए गए समर्थन कोड में structs को struct someobj *some, और कभी-कभी someobj_t *some के रूप में प्रस्तुत किया जाता था। क्या इन दो अलग-अलग तरीकों से structs को संदर्भित करने के लिए कोई वास्तविक/उपयोगी कारण है, या केवल एक स्टाइलिस्ट अंतर है?

+4

क्या आप 'typedef' खो रहे हैं? –

+3

क्या आप वाकई सही प्रश्न प्राप्त कर चुके हैं? 'someobj_t' एक ऑब्जेक्ट है, एक प्रकार नहीं, हो सकता है कि आपने अपने कोड में एक एकल 'टाइपपीफ' छोड़ा हो। – Kos

+1

'_t' नोटेशन, मान लीजिए कि आप टाइपिफ़ का मतलब रखते हैं, अगर केवल 'संरचना कुछबोज' और 'someobj'' को समझने के लिए एक सम्मेलन (मान लीजिए कि यह टाइप किया गया नाम था) - ऐसा इसलिए है क्योंकि सी के लिए दो अलग-अलग" नामस्थान "हैं ये (संरचना और टाइपिफ), और संभवतः यह सम्मेलन कोड में अर्थशास्त्र जोड़ने में मदद करता है। –

उत्तर

5

मान लिया जाये कि हम निम्न कोड बारे में पूछ रहे है (जैसा कि मैं लिख रहा हूँ वहाँ प्रश्न में कोई typedef है, लेकिन मैं यह सोचते हैं रहा हूँ वहाँ माना जाता था):

typedef struct someobj { 
    // content 
} someobj_t; 

वास्तव में आम तौर पर यह someobj नाम को छोड़ने के लिए पर्याप्त होगा और लगातार someobj_t का उपयोग करें। लेकिन वहाँ उस स्थिति है जब आप struct खुद का उल्लेख करना चाहते हैं:

typedef struct someobj { 
    struct someobj* next; 
    // cannot say someobj_t* yet - typedef not complete 
} someobj_t; 

// and from now on, both struct someobj and`someobj_t are equivalent 
1

मुझे लगता है कि तुम्हारा मतलब

typedef struct someobj { 
... stuff ... 
} someobj_t; 

यह आपको struct someobj के बजाय एक प्रकार के रूप में someobj_ टी का उपयोग करने की अनुमति देता है। दोनों नोटेशन बराबर हैं।

2

लेखकों पता नहीं हो सकता है कि आप (या करना पसंद करते हैं नहीं है) कर सकते हैं someobj छोड़ देते हैं। आप सिर्फ एक ही रास्ता प्रकार का उल्लेख करना चाहते हैं, तो आप लिख सकते हैं:

typedef struct { 
    ... 
} someobj_t; 

कोस एक और जवाब में उल्लेख के रूप में, यह ठीक है जब तक संरचना में कोई उल्लेख करने के लिए की जरूरत नहीं है है (उदाहरण के लिए में एक लिंक्ड सूची)। अधिकतम भ्रम के लिए, आप हमेशा कर सकता है:

typedef struct someobj_t { 
    ... 
} someobj_t; 
2

मान लें कि आप का मतलब:

typedef struct someobj 
{ 
    /* ... */ 
} someobj_t; 

सामान्य में अंतर सिर्फ शैलीगत है; कुछ लोग structs के लिए "पुरानी सी" शैली नामकरण (जहां आपको struct कीवर्ड को किसी भी समय संदर्भित कर रहे हैं) को चिपकाना पसंद करते हैं, अन्य someobj_t का उपयोग करने के अधिक सिंथेटिक तरीके की तरह।

typedef द्वारा परिभाषित प्रतीक का उपयोग करने वाले बहुत से लोग इसे अधिक प्राकृतिक महसूस करते हैं क्योंकि अक्सर वे अन्य भाषाओं (जैसे सी ++, सी #, ...) से आते हैं जहां struct चीज़ की आवश्यकता नहीं होती है। कई मामलों में वे घोषणा से struct नाम भी छोड़ देते हैं और बस typedef एड नाम छोड़ देते हैं।

उन दो प्रतीकों का उपयोग सामान्य समकक्ष में है, लेकिन कुछ चेतावनी हैं; सबसे पहले, typedef के अंत से पहले _t संस्करण मौजूद नहीं है, इसलिए आप _t नाम का उपयोग करके खुद को संरचना में पॉइंटर्स घोषित नहीं कर सकते हैं।

फिर, typedef केवल संकलन के दौरान "मौजूद" है; इसका मतलब है कि कंपाइलर और डीबगर आपके प्रतीक को गैर-typedef एड नाम के साथ संदर्भित करेंगे।यदि आप typedef का उपयोग "वास्तविक" संरचना नाम के बिना करते हैं, तो जब आपको कुछ कंपाइलर्स/डिबगर्स के साथ त्रुटियों की जांच करनी पड़ती है तो आप पागल हो सकते हैं क्योंकि आप वास्तविक नाम के बिना typedef एड संरचनाओं के बाद से "वास्तविक" संरचना नाम का संदर्भ नहीं ले सकते हैं वास्तव में अज्ञात संरचनाएं हैं।

यह विशेष रूप से समस्याग्रस्त हो सकता है यदि आपको अपनी संरचना को MIDL और उस तरह की सामग्री के साथ निर्यात करना है; अधिक जानकारी के लिए रेमंड चेन द्वारा this post देखें।

अंतिम लेकिन कम से कम नहीं, आप केवल असली संरचना नाम के साथ घोषणाएं कर सकते हैं; और यदि आपके पास संरचना का नाम नहीं है (लेकिन केवल typedef) तो आप घोषणाओं को आगे नहीं कर सकते हैं।

+0

हू? चूंकि लिंकर को टाइप नामों के बारे में कब पता है? –

+0

@ आर .: आप सही हैं, मुझे लगता है कि मैंने लिखा है क्योंकि मुझे सी ++ में लिंकर त्रुटियों में उपयोग किया जाता है, जहां लिंकर उस वर्ग के * प्रकार * को संदर्भित करता है जिस पर दोषपूर्ण विधि संबंधित होती है (भले ही उन प्रकार विधि नामों को कम करने का नतीजा है)। –

6

हालांकि यह आप पर निर्भर है कि क्या आप एक typedef या struct नाम का उपयोग, वहाँ एक बहुत अच्छे कारण के typedef नाम _t में समाप्त होने का उपयोग करने के नहीं है। ऐसे सभी नाम कार्यान्वयन के उपयोग के लिए POSIX द्वारा आरक्षित हैं, और कार्यान्वयन-विशिष्ट प्रकारों का संदर्भ ले सकते हैं या POSIX के भविष्य के संस्करणों में मानकीकृत किए जा सकते हैं। दुर्भाग्य से कई लाइब्रेरी लेखकों ने इसे अनदेखा किया।

व्यक्तिगत रूप से मैं संरचनाओं के लिए typedef का उपयोग नहीं करना पसंद करता, लेकिन यदि आप इसका उपयोग करना चुनते हैं, कम से कम आरक्षित नेमस्पेस से बचें।

+0

http://www.gnu.org/software/libc/manual/html_node/Reserved-Names.html (केवल कैनोलिक स्रोत के लिए एक लिंक प्रदान करना) –

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