2012-02-15 8 views
8

मैं निचले स्तर की गैर-ऑब्जेक्ट उन्मुख प्रोग्रामिंग भाषाओं पर एक विशेषज्ञ नहीं हूं, और मैं काम पर एक परियोजना के लिए कुछ सी कोड लिखने के बीच में हूं। मैं काम करने के लिए कुछ सभ्य अमूर्त डेटा प्रकार बनाने की कोशिश कर रहा हूं, और गूगलिंग ने मुझे महसूस किया कि लोग संरचना-आधारित एडीटी का दो तरीकों से उपयोग करते हैं। कुछ लोगों को एक struct के रूप में एक डेटा के प्रकार को परिभाषित:मुझे स्ट्रिप के लिए टाइप बनाम पॉइंटर कब टाइप करना चाहिए?

typedef struct adt { 
    //content here 
} adt; 

और हेडर फाइल में दुनिया के लिए उसे बेनकाब।

दूसरों struct करने के लिए एक सूचक के रूप में एक डेटा के प्रकार को परिभाषित:

// In .c file: 
typedef struct adt_s { 
    //content here 
} adt_s, *adt; 


// In .h file: 
typedef struct adt_s *adt; 

मैं समझता हूँ कि इस दृष्टिकोण आप बाहर की दुनिया क्या इस struct अंदर की किसी भी जानकारी दिए बिना एक struct typedef करने की अनुमति देता है, तो प्रोग्रामर केवल इस डेटा प्रकार पर काम करने के लिए एक ही हेडर फ़ाइल में दिए गए कार्यों का उपयोग कर सकते हैं।

क्या दूसरे पर लेने का कोई अन्य कारण है? क्या एडीटी को structs के रूप में परिभाषित करने के लिए एक सामान्य "अंगूठे का नियम" होता है और जब हम उन्हें structs के पॉइंटर्स के रूप में परिभाषित करते हैं?

उत्तर

6

आप अग्रेषित कर सकते हैं typedef भी बिना एक struct की घोषणा - केवल भेद हैं: इंटरफेस के साथ या कीवर्ड struct

  • इंटरफेस के साथ या स्पष्ट सूचक बिना क्लीनर लग रहा है कि क्या बिना क्लीनर लग रहा है

    • कि क्या *

    ईजी।

    struct S1; 
    typedef struct S2 S2; 
    typedef struct S3_s *S3; 
    
    void foo1(struct S1 *arg); 
    void foo2(S2 *arg); 
    void foo3(S3); 
    

    स्पष्ट रूप से यह केवल एक इंटरफेस हेडर में अग्रेषित घोषित संरचनाओं के लिए लागू होता है।

    यदि आप पहले स्थान पर संरचना कार्यान्वयन छुपा नहीं रहे हैं, तो S1 और S2 के बीच चयन प्राथमिकता (या स्थिरता) का विषय है। मैं S3 का उपयोग नहीं करता जबतक कि यह वास्तव में अपारदर्शी/छुपा प्रकार न हो।

    व्यक्तिगत प्राथमिकता छोटे/जटिल योगों के लिए S1 (स्पष्ट संरचना कीवर्ड) का उपयोग करना होगा, और S2 छोटे structs के लिए आप मूल्यों की तरह व्यवहार कर सकते हैं और हमेशा सूचक द्वारा पास नहीं होते हैं। YMMV।

  • +0

    पठनीयता प्रयोजनों के लिए शायद यह बेहतर है लिखने के लिए 'typedef struct S3_s * के बजाय' typedef struct S3_s * S3' S3', नहीं? – Eregrith

    +0

    @Eregrith: यदि आप औपचारिक भाषा अर्थ विज्ञान, से जाना 'typedef struct S3_s * S3' का कहना है कि declarator' * S3' टाइप किया है 'struct S3_s' और भंडारण वर्ग' typedef', तो पहचानकर्ता के साथ तारांकन डाल वास्तव में मुहावरेदार है ; हालांकि, प्रकार के साथ तारांकन डालने के साथ लोगों को घोषणाओं के बारे में कितने (? सबसे) लगता है धुन में अधिक है; जहाँ तक मैं concernded रहा हूँ, दोनों संस्करणों जब तक आप लगातार कर रहे हैं के रूप में ठीक हैं ... – Christoph

    +0

    मैं सिर्फ चयनित कि ओ पी के साथ स्थिरता के लिए रिक्ति, के बाद से मैं लाभ किसी भी तरह से देख सकते हैं। – Useless

    1

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

    1

    पढ़ लिनुस टोर्वाल्ड post अध्याय 5: typedefs

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