2012-04-29 39 views
8

सी ++ में आप दोनों सामान्य और टेम्पलेट का उपयोग करके सुरक्षित कंटेनर टाइप कर सकते हैं। हालांकि सी में, यदि आप जेनेरिक कंटेनर चाहते हैं, तो आपको void* का उपयोग करना होगा, जिसका अर्थ है कि आप टाइप सुरक्षा खो देते हैं। सुरक्षित कंटेनर टाइप करने के लिए, आपको उन सभी प्रकार के डेटा के लिए उन्हें दोबारा लागू करना होगा जिन्हें आप रखना चाहते हैं।सी में, जेनेरिक कंटेनर या सुरक्षित कंटेनर?

यह देखते हुए कि सी इस प्रकार एक और अधिक -प्रोग्रामर-जानता है-क्या-he's कर सी ++ से दर्शन, क्या सी में करने के लिए और अधिक मुहावरेदार बात होगी: void* साथ सामान्य कंटेनर का उपयोग, या के लिए कस्टम कंटेनर बनाने हर प्रकार का डेटा?

उत्तर

3

मैं सामान्य कंटेनरों के लिए लक्ष्य चाहते हैं:

  1. एक बार जब आप इसकी आदत हो, तो आप सिर्फ void * के बारे में सोच कुछ के प्रकार जिसका अर्थ है जब मैं इसे के प्रकार के बारे में परवाह नहीं है। यह जावा में Object जैसा है - जहां, लंबे समय तक, जेनेरिक कंटेनरों में टाइप सुरक्षा भी नहीं थी।

  2. आपके पास सुधार करने के लिए केवल एक ही स्थान है।

  3. आपको प्रकार की सुरक्षा नहीं मिलती है; लेकिन प्रकार के सुरक्षित कंटेनरों के बार-बार कार्यान्वयन के साथ, आप कॉपी और पेस्ट त्रुटियों का जोखिम चलाते हैं। इससे भी त्रुटियों का कारण बन सकता है।

0

सी में जेनेरिक डेटा को संभालने वाला एक प्रकार बनाने के लिए आप डेटा को पास करने के लिए void* का उपयोग करेंगे। प्रत्येक संभावित प्रकार के लिए नए एल्गोरिदम को परिभाषित करना अव्यवहारिक है।

+0

अच्छा, आप केवल आपको आवश्यक एल्गोरिदम परिभाषित करेंगे। लेकिन मैं देख रहा हूँ कि आप क्या कह रहे हैं। –

+0

@ पॉलमंटा: हाँ, मैं कंटेनर उदाहरण से बाहर जा रहा था जो मनमाना प्रकारों को संभालना चाहिए। –

0

आप एक सदस्य के रूप void* का उपयोग कर (जब तक कि, कहते हैं, संकलन बार सबसे अधिक महत्वपूर्ण हैं) करने के लिए कोई वास्तविक लाभ है, तो आप हमेशा void* जहां उपयुक्त हो, तो untyped डेटा धब्बे पर काम जहां आवश्यक हो पर कास्ट कर सकते।

मैंने सी में ऐसे इंटरफेस लागू किए हैं (उदाहरण के लिए विभिन्न प्रकार के नामित फ़ील्ड वाले कई प्रकार)। मैं प्रकार की सुरक्षा रखने का पक्ष लेता हूं, और शायद ही कभी इन कार्यान्वयन में void* पर कास्टिंग मिला।

... फिर, मैं और अधिक समय बिताने ++ सी से लिख सी :)

0

तो मैं एक त्वरित खोज देखने के लिए कि किसी भी नए चालाक विचारों सी कंटेनरों के क्षेत्र में उभरा था था।

मुझे this मिला। यह एक पूर्ण सी कंटेनर लाइब्रेरी में एक बहुत अच्छा प्रयास है।

यह void * पॉइंटर्स में निहित तत्वों के आसपास गुजरता है। किसी विशेष प्रकार की संरचनाओं को निर्दिष्ट करने का कोई प्रयास नहीं है।

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

मुझे लगता है कि यह सी कारणों में सी (+) में अधिक (एप्लिकेशन) प्रोग्राम लिखे गए हैं, सी में जटिल abstractions बनाने की क्षमता सीमित है। आप इसे कर सकते हैं लेकिन आप आम तौर पर प्रदर्शन या रखरखाव जैसे अन्य पहलुओं को त्यागते हैं (उदाहरण के लिए सी जीटीके प्रोग्राम देखें)।

+0

सी 11 के नए '_Generic' कीवर्ड के साथ, उन मैक्रोज़ वास्तव में बहुत बदसूरत नहीं हैं। क्लैंग पहले ही इसे लागू करता है, और जीसीसी में इसका अनुकरण करने के लिए पर्याप्त सुविधाएं भी हैं। –