2012-01-07 4 views
21

मैं सिर्फ C11 पर विकिपीडिया लेख, सी मानक दिसंबर 2011 में प्रदर्शित के नए संस्करण पढ़ रहा था, और मैंने देखा कि अतिरिक्त विशेषताओं में से एक था "टाइप-सामान्य भाव":सी 11 प्रकार-जेनेरिक एक्सप्रेशन - क्यों न केवल फ़ंक्शन ओवरलोडिंग जोड़ें?

टाइप-सामान्य _Generic कीवर्ड का उपयोग कर अभिव्यक्तियां। उदाहरण के लिए, मैक्रो cbrt (एक्स) निम्नलिखित (एक्स), cbrt (एक्स) या cbrtf (एक्स) एक्स के प्रकार पर निर्भर cbrtl करने के लिए अनुवाद:

#define cbrt(X) _Generic((X), long double: cbrtl, \ 
           default: cbrt, \ 
           float: cbrtf)(X) 

यह मेरे लिए बहुत भयानक लग रहा है - अगर वे वैसे भी भाषा बदलने के लिए जा रहे हैं, क्यों नहीं बस समारोह ओवरलोडिंग सी ++ में जोड़ने की तरह?

+13

शायद क्योंकि उसे नाम मैंगलिंग की आवश्यकता होगी, और _Generic संकलन-समय पर पूरी तरह से हल किया जा सकता है। वैसे भी, अगर आप सामान्य प्रोग्रामिंग के बारे में गंभीर हैं, तो आप नहीं सी –

+4

समारोह ओवरलोडिंग पर होने की संभावना लगभग सभी कार्यान्वयन (लगता है कि कैसे सी runtimes/linkers/लोडर प्रतीकों का इलाज) – nos

+3

@CatPlusPlus में एक विशाल पश्च संगतता समस्या उठाना होगा की तलाश की जानी चाहिए: "इनलाइन" घोषित कार्यों के लिए अधिभार की अनुमति देने से किसी भी नाम-उलझन के मुद्दों के बिना सामान्य फ़ंक्शन अधिभार के 99% लाभ मिलेगा। यहां तक ​​कि यदि कोई अन्य मॉड्यूल से ओवरलोडेड फ़ंक्शन को कॉल करने में सक्षम होना चाहता है, तो कोई भी हेडर फ़ाइल ओवरलोडेड "इनलाइन" फ़ंक्शंस में शामिल हो सकता है, जो विभिन्न पैरामीटर प्रकारों के लिए अलग-अलग नामों को कॉल करेगा। फ़ंक्शंस के नाम हेडर फ़ाइल में निर्दिष्ट किए जाएंगे, इसलिए कोई कंपाइलर-विशिष्ट मैंगलिंग की आवश्यकता नहीं होगी। क्या इसके साथ कोई समस्या हो सकती है? – supercat

उत्तर

26

सी के बाहरी प्रतीकों के लिए एक नामस्थान है, और ओडीआर (एक परिभाषा नियम) लागू करता है जैसे दो extern दो अनुवाद इकाइयों में समान नाम वाले ऑब्जेक्ट्स में एक ही परिभाषा होनी चाहिए।

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

TGE (के रूप में पुस्तकालय द्वारा प्रयुक्त) सिर्फ नाम mangling की एक मैन्युअल रूप से संचालित संस्करण है। यह गणित-गहन आंतरिक लूपों की पीढ़ी को नियंत्रित करने के लिए typedef घोषणाओं की अनुमति देने के लिए, जो संभवतः बहुत दूर भविष्य में काम करता है (या करेगा)। जिन लोगों को सी ++ जैसी भाषा की विशेषताओं की आवश्यकता होती है उन्हें सी ++ में बंदरगाह होना चाहिए।

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