मुझे एपीआई उपयोगकर्ताओं को "*" टाइप करने की आवश्यकता होगी, यानी स्ट्रिप टाइप करें, संरचना के लिए सूचक नहीं। यह जीएलआईबी में व्यापक रूप से उपयोग की जाने वाली शैली है, जो कि अधिक लोकप्रिय सी स्टैक में से एक है।
यह अच्छी तरह से काम करता है क्योंकि यह यह जानना महत्वपूर्ण है कि आपके पास संरचना या संरचना के लिए सूचक है या नहीं। उदाहरण के लिए, क्या आप प्रकार के चर में न्यूल स्टोर कर सकते हैं? यदि आप छुपाते हैं कि ऑब्जेक्ट एक पॉइंटर है, तो आपको NULL को प्रतिस्थापित करने के लिए एक विशेष NIL_NODE या अन्य मान बनाना होगा। यदि आप इसे एक सूचक बनाते हैं, तो लोग इसे एक जैसा व्यवहार कर सकते हैं।
एक और महत्वपूर्ण लाभ वास्तविक संरचना परिभाषा को कहीं भी निजी रखने की क्षमता है, यानी शीर्षलेख में बजाय .c फ़ाइल में। संरचना को स्वयं एपीआई उपयोगकर्ताओं के लिए अपारदर्शी रखते हुए, आप केवल हेडर में टाइपपीफ डाल सकते हैं। इसके लिए लोगों को केवल निर्यातित विधियों का उपयोग करने की आवश्यकता होती है जो आप संरचना में हेरफेर करने के लिए प्रदान करते हैं। इसका मतलब यह भी है कि यदि आप संरचना फ़ील्ड बदलते हैं तो आपको दुनिया का पुनर्निर्माण करने की आवश्यकता नहीं है।
फिर भी इस पथ को लेने का एक अन्य कारण यह है कि कभी-कभी आप एक ऐसी संरचना चाहते हैं जिसे कॉपी किया जा सके, और आप अभी भी इसे टाइप करना चाहते हैं। GdkPoint की तरह एक बात लें:
typedef struct {
int x, y;
} GdkPoint;
यहाँ यह प्रत्यक्ष struct उपयोग की अनुमति के लिए उपयोगी है, जैसे:,
GdkPoint point = { 10, 10 };
GdkPoint copy = point;
do_stuff_with_point(©);
लेकिन अगर आपके सम्मेलन है कि "GdkPoint" typedef एक सूचक हो सकता है, आप ' असंगत होना होगा।
कोड केवल स्पष्ट है अगर आप यह बता सकते हैं कि कोई सूचक क्या है और क्या नहीं है, और यदि आप हेडर में स्ट्रक्चर परिभाषाएं नहीं डालते हैं तो कोड बेहतर होता है (ऐसे structs के लिए जो अमूर्त, अपारदर्शी डेटा प्रकारों का प्रतिनिधित्व करते हैं, जो कि है शायद सबसे आम तरह)।
एक सी डेटा प्रकार के लिए मेरे डिफ़ॉल्ट टेम्पलेट शीर्षक में कुछ इस तरह है:
typedef struct MyType MyType;
MyType* my_type_new(void);
void my_type_unref(MyType *t);
void my_type_ref(MyType *t);
वास्तविक "struct MyType" ग फ़ाइल में फिर, नए, unref के साथ-साथ, और किसी भी प्रकार पर संचालन।
अपवाद पॉइंट, आयत, रंग जैसे प्रकारों के लिए होगा जहां यह "सादा पुराना डेटा" है और प्रत्यक्ष क्षेत्र का उपयोग वांछित है; अगर आपको refcounting की आवश्यकता नहीं है तो _unref() के बजाय my_type_free() एक और भिन्नता है।
किसी भी तरह, यह एक शैली है, मूल रूप से जीएलआईबी शैली, जिसका व्यापक रूप से उपयोग किया जाता है और अच्छी तरह से काम करने के लिए जाना जाता है।
इसी प्रकार का प्रश्न: http://stackoverflow.com/questions/3781932/is-typedefing-a-pointer-type-cononsidered-bad-practice –
या न तो ... :) – alternative