2010-05-29 22 views
8

मुझे लगता है कि सी इतना प्रकार-सुरक्षित नहीं है और मुझे लगता है कि मैं इसे अपने वर्तमान प्रोजेक्ट के लिए एक लाभ के रूप में उपयोग कर सकता हूं।सी: किसी भी प्रकार के पॉइंटर्स?

उदाहरण के लिए, मैं वीएम के लिए लक्ष्य के साथ एक दुभाषिया डिजाइन कर रहा हूं, रूबी और पायथन से बहुत तेज है।

अब मुझे पता है कि समयपूर्व अनुकूलन "सभी बुराइयों की जड़ है" लेकिन यह एक वैचारिक समस्या है।

  • मैं (सूचीबद्ध करने के लिए स्ट्रिंग और नक्शे पर नंबर से)

निम्नलिखित संभव है मेरी भाषा में सभी मूल्यों का प्रतिनिधित्व करने के लिए struct किसी प्रकार का उपयोग करने के लिए है?

struct Value { 
ValueType type; 
void* value; 
} 
  • मैं वास्तविक मान कहीं और संग्रहीत करेंगे, उदाहरण के लिए: स्ट्रिंग्स और पूर्णांकों के लिए एक अलग सरणी, मूल्य * तो इस तालिका में कुछ सदस्य को इंगित करेंगे।

  • मैं हमेशा टाइप वैरिएबल के माध्यम से मूल्य के प्रकार को जानता हूं, इसलिए टाइप त्रुटियों के साथ कोई समस्या नहीं होगी।

अब:

वाक्य रचना और टाइपिंग के मामले में यह और भी संभव है?

+0

मुझे लगता है कि आप अपना खुद का मेमोरी मैनेजर भी लिखने की योजना बना रहे हैं? –

उत्तर

7

हाँ, आप कुछ भी करने के लिए बात करने के लिए एक void* उपयोग कर सकते हैं, और फिर उचित प्रकार जब जरूरत के लिए यह डाली (कि कैसे malloc और इस तरह के काम कर सकते हैं है)।

void* मूल रूप से "स्मृति के मनमानी ब्लॉक के लिए सूचक" है।

0

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

+0

जावा प्रीकंपिल्ड बाइटकोड है, इसे परिभाषा के अनुसार रन-टाइम दुभाषिया से तेज़ होना चाहिए। वैसे भी, "ड्रैगमे" जावा के बारे में बात नहीं करता है, इसलिए मुझे समझ में नहीं आता कि आप इसका उल्लेख क्यों करते हैं? –

+0

जावा में एक जेआईटी भी है, जो परिभाषा के अनुसार precompiled बाइटकोड से तेज है :) –

+0

(जेआईटी पहलुओं के अलावा, जो मैं स्वीकार करता हूं) जावा बाइटकोड एक वीएम पर चलता है। वीएम रन-टाइम दुभाषियों की तुलना में "परिभाषा द्वारा" तेज नहीं हैं। वास्तव में, वीएम रन-टाइम दुभाषिया हैं। – warrenm

0

अच्छी खबर: किसी और ने इसके बारे में सोचा। संस्करण देखें। (उदाहरण के लिए http://en.wikipedia.org/wiki/Variant_type और http://msdn.microsoft.com/en-us/library/x295h94e(VS.80).aspx।) बुरी खबर: हममें से जो लोग उनके साथ काम करते थे, वे आम तौर पर उनसे नफरत करते थे।

7

आप आप का समर्थन करना चाहते प्रकार की सीमा पता है, यह आसानी से एक union के साथ किया जा सकता है हर जगह डाले से बचने के लिए:

struct Value 
{ 
    ValueType type; 
    union 
    { 
     int*  iptr; 
     char*  sptr; 
     float*  fptr; 
     struct map* mptr; 

     /* ... */ 

     void* vptr; /* catch all, extensions */ 

    } ptrs; 
}; 
+0

अनुमोदित, यह एक कलाकार को टाइप करने से ज़्यादा छोटा नहीं है, खासकर यदि रूपांतरण प्रारंभ हो रहा है। – Amber

+0

बेशक यह आवश्यक नहीं है, यह आपको सुविधा मैक्रोज़ का गुच्छा लिखने की अनुमति देता है। –

+0

और कोड को देखकर कोई भी शून्य * के बजाय अलग-अलग मान प्रकार देख सकता है। एएसटी/दुभाषिया में यूनियनों का उपयोग करना एक बहुत ही आम पैटर्न है। –

2

ज़रूर यह है। किसी विशेष मूल्य के प्रकार को अलग करने के लिए आपको केवल type पर एक बड़ा स्विच की आवश्यकता होगी। सबसे अच्छा प्रकार तो जैसे अपनी भाषा के प्रकार से प्रत्येक के लिए अपने क्षेत्र type के लिए उपयोग करने के लिए शायद एक enum हो जाएगा एक निरंतर साथ,:

typedef enum type { 
    Integer, 
    String, 
    /* and so on... */ 
} ValueType; 

इसके अलावा, आप को याद है इससे पहले एक विशेष प्रकार void* सूचक कास्ट करने के लिए उसका इस्तेमाल कर रहे हैं।

0

ऐसा नहीं है कि कोड लिखने के लिए ठीक है, लेकिन शायद आप अपने "भाषा" (दुभाषिया ठीक है, :)) अन्य बातों से पहले डिजाइन करने के लिए किया है।

Btw, मैं सुझाव है कि आप object oriented programming in c book पढ़ने के लिए। जब आप मुख्य अवधारणाओं को समझ चुके हैं, तो आप Python Objects के कार्यान्वयन को देख सकते हैं, ताकि आप इस बारे में सोच सकें कि ऑब्जेक्ट्स के साथ कैसे तरीके से बातचीत की जाती है और वे कैसे संग्रहीत होते हैं, और इसी तरह।

अलविदा अलविदा!

0
मैक्रो जिनकी मदद से आप बुरा डाले से बचने के लिए

चेक बाहर CCAN's type safe callbacks। मुझे पता है तुम एक कॉलबैक नहीं लिख रहे हैं, लेकिन कॉलबैक के बहुत सारे इस तरह दिखेगा:

void my_callback(void *context) 

और कई प्रकार के context को (void *) लिए डाली और पारित किया जा सकता है। उस फ़ंक्शन के भीतर कास्ट करना मुश्किल हो जाता है, खासकर यदि कॉलबैक एक थ्रेड लॉन्च करता है जो एक (void *) तर्क लेता है।

वैसे भी, यदि आप लिंक का पालन करते हैं तो आपको कुछ उपयोगी बिट मिल सकते हैं।

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