2011-11-18 15 views
6

typedefs के लिए दृढ़ता से टाइप नहीं किया जा रहा है? क्या कोई लाभ है जिसे मैं नहीं देख सकता या पिछड़ा संगतता के कारण है? इस उदाहरण देखें:टाइपपीफ को दृढ़ता से टाइप क्यों नहीं किया जाता है?

typedef int Velocity; 
void foo(Velocity v) { 
    //do anything; 
} 
int main() { 
    int i=4; 
    foo(i); //Should result in compile error if strongly typed. 
    return 0; 
} 

मैं एक मजबूत टाइप डेटाप्रकार प्राप्त करने के लिए समाधान के लिए पूछ नहीं कर रहा हूँ, लेकिन केवल जानना चाहता है कि मानक typedefs की जरूरत नहीं है दृढ़ता से टाइप किया जा करना चाहते हैं?

धन्यवाद।

+3

क्योंकि सी उन लोगों के लिए एक भाषा है जो चीजें प्राप्त करना चाहते हैं, न कि उन लोगों के लिए जो सार प्रकार प्रणालियों की गणितीय सौंदर्य पर विचार करना चाहते हैं। (जो कोई भी दोनों गतिविधियों की सराहना करता है, मैं किसी एक का न्याय नहीं कर रहा हूं)। –

+3

@ स्टीफन कैनन: कौन कहता है कि सार प्रकार सिस्टम आपको चीजों को पूरा करने में मदद नहीं कर सकता है? रनटाइम त्रुटियों को डिबग करना जो गलती से दुरुपयोग किए गए प्रकारों के परिणामस्वरूप निश्चित रूप से मेरी पुस्तक में हो रही चीजें प्राप्त करने के रूप में नहीं गिना जाता है। –

+0

@ माइकलबोर्गवर्ड: मैंने निश्चित रूप से यह नहीं कहा कि वे नहीं कर सकते हैं। हालांकि, वे * दुर्व्यवहार किया जा सकता है। –

उत्तर

14

क्योंकि सी दृढ़ता से टाइप नहीं कर रहा है और typedef कि सोच

typedef में अपने मूल बस सुविधा और पठनीयता के लिए है, यह एक नए प्रकार का निर्माण नहीं करता।

4

typedef सिर्फ एक मिसनोमर (कई अन्य कीवर्ड की तरह) है। इसे typealias के रूप में सोचें।

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

+2

सी का मुख्य विचार वास्तव में नहीं है "यह सब सिर्फ बिट्स है, चलो इसे बहुत ज्यादा छिपाएं नहीं"? –

+1

@ माइकलबोर्गवर्ड, नहीं, मुझे ऐसा नहीं लगता है। अन्यथा इसमें संगत प्रकारों का यह विस्तृत मॉडल नहीं होगा। –

0

यहां तक ​​कि अगर Velocityint से अलग प्रकार थे, अपने कोड संकलन और रूपांतरण नियम की वजह से ठीक काम करेगा। int *, आदि की अपेक्षा रखने वाले फ़ंक्शन में Velocity * की अभिव्यक्ति को पारित करने के लिए काम नहीं करेगा। यदि आप बाद के प्रवर्तन प्रकार को प्राप्त करना चाहते हैं, तो बस Velocity एक संरचना या यूनियन प्रकार को एक पूर्णांक युक्त बनाएं, और अब आपके पास एक नया असली प्रकार।

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