2009-08-10 11 views
5

मुझे लगता है कि अधिकांश सी ++ कंपाइलर्स असेंबली में लिखे गए हैं। जो उन्हें पूरी तरह से अलग भाषाओं बनाता है (मैं गलत हो सकता है)। ऐसा कहा जा रहा है कि अगर मैं सादे पुराने सी के लिए cout स्टाइल फ़ंक्शन बनाने जा रहा था, तो मैं इसे कैसे करूँगा?सी में एक cout समारोह बनाना?

// endl not only prints a new line but also flushes the stream 
cout << "Hello World!" << endl; 

कौन सा मैं बहुत यकीन है कि सी में इस के लिए अनुवाद:

printf("Hello World!\n"); 
fflush(1);     //stdout = 1 

कारोबार का अगला आदेश, << ऑपरेटरों cout कुछ बहुत ही प्रभावशाली सुविधाओं उदाहरण के लिए इस टुकड़ा ले है। सी ++ में यह आसान होगा (ऑपरेटर ओवरलोडिंग), लेकिन मैं सी

+2

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

+0

@ विशिष्ट कंपाइलर: मुझे पता है कि आपकी क्या कह रही है। यही कारण है कि मैंने इसे hypothetical चिह्नित किया। यह महत्वपूर्ण नहीं है ... मैं सिर्फ उत्सुक हूँ। – Kredns

+4

अधिकांश सी ++ कंपाइलर्स सी या सी ++ में लिखे गए हैं - और असेंबली में नहीं। –

उत्तर

5

यह करने का एकमात्र तरीका नहीं सोच सकता है, क्योंकि सी ऑपरेटर ओवरलोडिंग नहीं है, इसलिए आप < के व्यवहार को नहीं बदल सकते < ऑपरेटर, यह हमेशा थोड़ा बदलाव करेगा, इसलिए सी ++ में सी ++ में सटीक अर्थशास्त्र के साथ 'कोउट' लिखने का कोई तरीका नहीं है, सी

ब्याज से, जी ++ (जीएनयू सी ++ कंपाइलर) ज्यादातर लिखा जाता है सी

4

सी वास्तव में सी ++ कंपाइलर्स और मानक पुस्तकालयों के लिए एक लोकप्रिय कार्यान्वयन भाषा है (इसलिए सी ++ स्वयं, वास्तव में - एक अवधारणा जिसे कभी-कभी स्वयं-होस्टिंग या बूटस्ट्रैपिंग के रूप में जाना जाता है), और आप कर सकते हैं एक समृद्ध, जटिल सी ++ मानक पुस्तकालय (प्लस एक्सटेंशन) के पूरे स्रोतों का अध्ययन करें here (क्षमा करें, यह जीसीसी 3 है - एक जीसीसी 4 स्रोत पेड़ नहीं मिल सकता है जो कि आसानी से ऑनलाइन ब्राउज़ करने योग्य है, बेशक आप आसानी से उनको डाउनलोड कर सकते हैं स्रोतों और उन्हें अपने स्थानीय मशीन पर अध्ययन)।

व्यक्तिगत रूप से, मैं इस तरह के this one के रूप में एक अच्छी किताब के साथ बजाय शुरुआत करने की सलाह होता है, - सूत्रों का कहना है बहुत कुछ आपके लिए होगा एक बार आप (के रूप में सभी अस्पष्ट nooks और सी ++ के iostreams के crannies की अच्छी जानकारी मिल गया है एक बोनस, पुस्तक आपको स्थानीय लोगों के माध्यम से एक निर्देशित दौरे पर ले जाती है - अपनी टोपी पर पकड़ो! -)।

8

यह "< <" ऑपरेटर सिंटैक्स और "ऑपरेटर < <" फ़ंक्शन सिंटैक्स के बीच अनुवाद करने के बारे में सोचने में मदद कर सकता है। आपका सी ++ उदाहरण सी ++ कोड के इस बिट के बराबर है:

operator<< (operator<< (cout, "Hello World!"), endl); 

पहली बात यह है कि तुम यहाँ नोटिस देना चाहिए वहाँ सब पर अदालत में चतुराई का एक बहुत वास्तव में नहीं है। चालाक क्या है ऑपरेटर < < फ़ंक्शन - विशेष रूप से, ऑपरेटर का संस्करण < < फ़ंक्शन जो स्ट्रीम ऑब्जेक्ट लेता है (जो कि cout है, लेकिन कई अन्य चीजें भी हैं) इसके पहले तर्क के रूप में। या, और भी सटीक, ऑपरेटर < < फ़ंक्शन जो पहले ऑब्जेक्ट के रूप में स्ट्रीम ऑब्जेक्ट लेते हैं, और दूसरी तर्क के रूप में एक विशेष चीज़ लेते हैं - प्रत्येक प्रकार की ऑब्जेक्ट के लिए एक है जिसे आप कोउट स्ट्रीम में डाल सकते हैं। आप उस वाक्यविन्यास में सी ++ चालों में से एक को भी देख सकते हैं; ऑपरेटर < < स्ट्रीम ऑब्जेक्ट्स पर फ़ंक्शन हमेशा स्ट्रीम ऑब्जेक्ट को वापस लौटाते हैं, जिससे इस प्रकृति की श्रृंखला को अनुमति मिलती है।

सी ++ कोड को लिंकर्स और सिस्टम एबीआई में डालने के लिए जो सी-जैसे फ़ंक्शन सिंटैक्स की अपेक्षा करते हैं, अधिकांश सी ++ कंपाइलर्स फ़ंक्शन नामों को "मैंगल" करते हैं, ताकि उनमें उनके द्वारा तर्कों के प्रकार को एन्कोड किया जा सके। (इसके अलावा, ज़ाहिर है, "< <" वैध सी-जैसे फ़ंक्शन नाम नहीं है।) इसलिए, यदि आपने इस बिट फ़ंक्शन के लिए जेनरेटेड असेंबली को देखा है, तो आप देखेंगे कि दो कार्यों के नाम थे एक-दूसरे से अलग - वे तर्क प्रकारों को इंगित करने वाले प्रत्यय होंगे।आपको लगता है कि मैन्युअल रूप से की तरह कुछ कर सकता है:

operator_lshift__stream__endl(
    operator_lshift__stream__string(cout, "Hello World!"), endl); 

और वहाँ आप कुछ है कि आप सी में लागू कर सकता है मिल गया है

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