यह "< <" ऑपरेटर सिंटैक्स और "ऑपरेटर < <" फ़ंक्शन सिंटैक्स के बीच अनुवाद करने के बारे में सोचने में मदद कर सकता है। आपका सी ++ उदाहरण सी ++ कोड के इस बिट के बराबर है:
operator<< (operator<< (cout, "Hello World!"), endl);
पहली बात यह है कि तुम यहाँ नोटिस देना चाहिए वहाँ सब पर अदालत में चतुराई का एक बहुत वास्तव में नहीं है। चालाक क्या है ऑपरेटर < < फ़ंक्शन - विशेष रूप से, ऑपरेटर का संस्करण < < फ़ंक्शन जो स्ट्रीम ऑब्जेक्ट लेता है (जो कि cout है, लेकिन कई अन्य चीजें भी हैं) इसके पहले तर्क के रूप में। या, और भी सटीक, ऑपरेटर < < फ़ंक्शन जो पहले ऑब्जेक्ट के रूप में स्ट्रीम ऑब्जेक्ट लेते हैं, और दूसरी तर्क के रूप में एक विशेष चीज़ लेते हैं - प्रत्येक प्रकार की ऑब्जेक्ट के लिए एक है जिसे आप कोउट स्ट्रीम में डाल सकते हैं। आप उस वाक्यविन्यास में सी ++ चालों में से एक को भी देख सकते हैं; ऑपरेटर < < स्ट्रीम ऑब्जेक्ट्स पर फ़ंक्शन हमेशा स्ट्रीम ऑब्जेक्ट को वापस लौटाते हैं, जिससे इस प्रकृति की श्रृंखला को अनुमति मिलती है।
सी ++ कोड को लिंकर्स और सिस्टम एबीआई में डालने के लिए जो सी-जैसे फ़ंक्शन सिंटैक्स की अपेक्षा करते हैं, अधिकांश सी ++ कंपाइलर्स फ़ंक्शन नामों को "मैंगल" करते हैं, ताकि उनमें उनके द्वारा तर्कों के प्रकार को एन्कोड किया जा सके। (इसके अलावा, ज़ाहिर है, "< <" वैध सी-जैसे फ़ंक्शन नाम नहीं है।) इसलिए, यदि आपने इस बिट फ़ंक्शन के लिए जेनरेटेड असेंबली को देखा है, तो आप देखेंगे कि दो कार्यों के नाम थे एक-दूसरे से अलग - वे तर्क प्रकारों को इंगित करने वाले प्रत्यय होंगे।आपको लगता है कि मैन्युअल रूप से की तरह कुछ कर सकता है:
operator_lshift__stream__endl(
operator_lshift__stream__string(cout, "Hello World!"), endl);
और वहाँ आप कुछ है कि आप सी में लागू कर सकता है मिल गया है
स्रोत
2009-08-10 05:29:06
सुनिश्चित नहीं हैं कि जहां इस पर शुरू करने के लिए ... संक्षिप्त उत्तर है कि C++ है भाषा को इस तरह वाक्यविन्यास की अनुमति देने के लिए परिभाषित किया गया है, और सी भाषा नहीं है। - लेकिन आपका प्रश्न "सी-एक्सटेंशन भाषा के लिए एक कंपाइलर कैसे लिखूं" से लिया जा सकता है? "मैं विशेष वाक्यविन्यास के लिए सी-शैली मैक्रोज़ के साथ कस्टम लाइब्रेरी में iostream कार्यक्षमता को कैसे डुप्लिकेट करूं?" –
@ विशिष्ट कंपाइलर: मुझे पता है कि आपकी क्या कह रही है। यही कारण है कि मैंने इसे hypothetical चिह्नित किया। यह महत्वपूर्ण नहीं है ... मैं सिर्फ उत्सुक हूँ। – Kredns
अधिकांश सी ++ कंपाइलर्स सी या सी ++ में लिखे गए हैं - और असेंबली में नहीं। –