सी + + लिंकेज सी के अलावा अन्य भाषाएँ?


25

C ++ लैंग्वेज C ++ और C दोनों को एक सोर्स फाइल में इंटरमिक्स करने की अनुमति देता है। उदाहरण के लिए,

extern "C" {
    struct bar { /* ... */ }
}

क्या C ++ या क्या उसने कभी C के अलावा किसी अन्य "लिंकेज भाषा" का समर्थन किया है? जैसे extern "Pascal"याextern "Haskell"


अधिकांश समय दोनों भाषाएं extern "C"एक-दूसरे के साथ बातचीत करने के लिए अपने समकक्ष करेंगी
शाफ़्ट फ्रीक

C ++ अपने लिंकेज प्रकार (,7.5) को जोड़ने की अनुमति देकर अन्य लिंकेज का समर्थन करता है, सवाल यह होना चाहिए कि "क्या कार्यान्वयन मौजूद हैं या क्या कार्यान्वयन मौजूद हैं?" ;-)
johannes

2
extern "C"केवल लिंकेज को प्रभावित करता है, ब्लॉक के अंदर पाठ के वाक्य-विन्यास और शब्दार्थ को नहीं। दूसरे शब्दों में, यह उस extern "C"ब्लॉक के अंदर अभी भी C ++ है ; प्रतीक नामों को अभी मंगाई नहीं गई है। देखें stackoverflow.com/q/1041866/712605
रिचर्ड हैनसेन

जवाबों:


17

extern "C" केवल एक ही आवश्यक हो सकता है:

प्रत्येक कार्यान्वयन सी प्रोग्रामिंग भाषा, "सी", और सी ++ फ़ंक्शंस, "सी ++" के लिंकेज में लिखे कार्यों के लिए लिंकेज प्रदान करेगा।

हालाँकि अन्य इस उद्धरण के अनुसार मौजूद हो सकते हैं:

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


1
यह कहाँ से उद्धृत किया गया है?
पउल

@paul c ++ 11 मानक ड्राफ्ट
aaronman

9

कई (अधिकांश) वातावरणों में "बाहरी" सी "सिस्टम पर किसी भी भाषा के लिए डिफ़ॉल्ट लिंकिंग कन्वेंशन है।

तो ऑपरेटिंग सिस्टम और "विदेशी" भाषा "एक्सटर्नल सी" के कार्यान्वयन के आधार पर, आपको एक अन्य संकलन भाषा में प्रोग्राम को कॉल करने की आवश्यकता है।


यहां तक ​​कि सी लिंकेज (पास्कल) का उपयोग नहीं करने वाले वातावरण भी अक्सर स्टैक पर अन्य तर्क आदेश का उपयोग करते हैं और कैली को मूल्य मुक्त करना पड़ता है) उनके पास एक सी-संगत मोड है
जोहान्स

@johannes: वास्तव में विंडोज कई चीजों के लिए पास्कल कन्वेंशन का उपयोग करता है, लेकिन चूँकि इसे C में भी आवश्यकता होती है और C में extern "Language"सिंटैक्स नहीं होता है, इसलिए वे इसे प्लेटफॉर्म-विशिष्ट C एक्सटेंशन के माध्यम से करते हैं, इसलिए C ++ के लिए यह अभी भी है extern "C"और विशेष कीवर्ड अलग-अलग कॉलिंग कन्वेंशन को निर्दिष्ट करता है।
Jan Hudec

1
फिर भी ऐसे मामले हो सकते हैं जहां एक कंपाइलर विक्रेता विशेष लिंकेज प्रकार जोड़ता है। अन्य भाषाओं के साथ इंटरऑपरेबिलिटी के अलावा, यह अलग सी ++ नाम के साथ इंटरऑपरेबिलिटी के लिए भी दिलचस्प हो सकता है। प्रश्न यह है कि क्या किसी ने भी :)
जोहान्स


-4
  • नहीं! C ++ केवल "लिंकेज भाषाओं" के रूप में C का समर्थन करता है।

  • बाहरी "C" {स्ट्रक्चर बार {/ * ... * /}}

  • ऊपर के रूप में वाक्य रचना का मतलब है कि चर, संरचना या फ़ंक्शन का नाम न बदलें। चूँकि C ++ शायद Class, Namespace और function overloading को लागू करने के लिए वैरिएबल, स्ट्रक्चर या फंक्शन का नाम बदल देता है।

  • यदि आप ऐसा नहीं करते हैं, तो लिंकर शायद चर की वस्तु, फ़ंक्शन की संरचना का पता नहीं लगा सकता है।

  • C ++ को C के साथ संगत करने के लिए डिज़ाइन किया गया है। बाहरी "C", C के साथ संगत को लागू करने का तरीका है।


10
कृपया C ++ मानक के .57.5 की जांच करें। extern "C"और extern "C++"केवल अनिवार्य हैं, लेकिन कार्यान्वयन दूसरों को प्रदान करने की अनुमति है।
जोहान्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.