2010-09-16 15 views

उत्तर

9

यह आवश्यक है जब C++ फ़ंक्शन कोड C++ कोड के बजाय कोड द्वारा कॉल किया जाना चाहिए।

असल में, जब आप अपनी C++ लाइब्रेरी को पीछे संगत होने के लिए चाहते हैं।

+2

नहीं, नहीं, नहीं ... उह! यदि कोई प्रोजेक्ट 'सी' है, तो इसे 'सी ++' न जोड़ें: इसे 'सी ++' में परिवर्तित करें और यदि आवश्यक हो, तो 'सी ++' प्रोजेक्ट में 'सी' जोड़ें। * या (यहां तक ​​कि बेहतर आईएमएचओ) इसे 'सी' में रखें और' सी ++ 'से पूरी तरह से बचें। * – pmg

+2

यह उत्तर सही है लेकिन अधूरा है, जैसे @ ग्राहम पेर्क द्वारा उत्तर, जो भी सही लेकिन अपूर्ण है। पूरा जवाब दोनों का योग होगा। –

+0

@pmg: आपके पास सी प्रोजेक्ट का स्वामित्व नहीं हो सकता है या यदि आपकी लाइब्रेरी सी ++ –

13

यदि आपका फ़ंक्शन किसी .c फ़ाइल में कार्यान्वित किया गया है, तो .cpp फ़ाइलों को बाहरी "सी" संदर्भ की आवश्यकता होगी, अन्यथा वे एक उलझन में C++ - शैली फ़ंक्शन नाम का संदर्भ लेंगे, और लिंक विफल हो जाएगा।

यह डीएलएल से कार्यों को निर्यात करने के लिए भी आसान है ताकि उन्हें एक गैर-उलझन वाले नाम से निर्यात किया जा सके।

+3

यह उत्तर सही है लेकिन अधूरा है, जैसे @Randolpho द्वारा उत्तर, जो भी सही लेकिन अपूर्ण है। पूरा जवाब दोनों का योग होगा। –

3

क्योंकि सी और सी ++ कंपाइलर्स द्वारा उत्पन्न फ़ंक्शन हस्ताक्षर भिन्न होते हैं - यह C++ का उपयोग करते समय भी सी फ़ंक्शन के लिए सी सम्मेलन सेट करता है।

4

जैसा कि आप जानते हैं कि C++ समर्थन फ़ंक्शन ओवरलोडिंग, जो विभिन्न पैरामीटर के साथ कई बार एक ही फ़ंक्शन या विधि को परिभाषित करता है। ऐसा करने के लिए, संकलक हर एक के लिए प्रतीकों का कुछ हिस्सा जोड़ने के लिए ... उदाहरण के लिए, संकलक

[email protected]&c 
को

void foo(int f,char c); 

से निम्नलिखित घोषणा में समारोह नाम foo बदल जाएगा है

दुर्भाग्यवश, सी इसका समर्थन नहीं करता है। सभी फ़ंक्शन नाम इसे संकलित करने के बाद समान रहते हैं। तो, सी से एक सी ++ फ़ंक्शन को कॉल करने के लिए, आपको संशोधन के बाद सटीक नाम पता होना चाहिए और मुझे लगता है कि यह एक कंपाइलर से दूसरे में कठिन और अलग है।

इस को हल करने के और ग से सक्षम कॉल ++ समारोह सी हो सकता है और नाम आप

extern "C" { 
void foo(int f,char c); 
} 

यह है कि जैसे इस कीवर्ड का उपयोग करने के बदलने से संकलक को रोकने के लिए !!!

+0

+1 कारणों को स्पष्ट रूप से समझाते हुए, लेकिन यह विपरीत दिशा में भी होता है: यदि आपके पास लाइब्रेरी में सी में कोई फ़ंक्शन है, और आप 'बाहरी "सी' क्वालीफायर के बिना हेडर शामिल करते हैं, तो C++ कंपाइलर मैंगल करेगा प्रतीक। फिर लिंक चरण पर यह उलझन वाले प्रतीक का पता लगाने की कोशिश करेगा और ऐसा करने में विफल रहेगा, क्योंकि सी कंपाइलर ने सी कोड संकलित करते समय नाम को उलझाया नहीं था। –

9

extern "C" के लिए दो अलग-अलग उपयोग हैं। एक सी ++ में एक फ़ंक्शन को परिभाषित करना है कि आप सी से कॉल करने में सक्षम होना चाहिए। आप सी ++ में कोड लिख रहे हैं, लेकिन इसे सी कोड के साथ इंटरफेस करने की आवश्यकता है। इस मामले में, आपextern "C" के रूप में समारोह को परिभाषित :

extern "C" { 
    int c_callable_func1() {} 
    int c_callable_func2() {} 
} 

जब आप ऐसा करते हैं, उन कार्यों के इंटरफेस काफी वही नियम का पालन करना होगा के रूप में वे सी में होगा के रूप में अच्छी तरह से (जैसे, आप कर सकते हैं ' कार्यों को अधिभारित करें या किसी भी पैरामीटर के लिए डिफ़ॉल्ट मान का उपयोग करें)।

अन्य (काफी आम) स्थिति यह है कि आपके पास सी में कोड लिखा गया है जिसे आप सी ++ से कॉल करने में सक्षम होना चाहते हैं। इस मामले में, फ़ंक्शन परिभाषा बिल्कुल पहले की तरह ही रहती है, लेकिन कार्यों को extern "C" के रूप में घोषित/प्रोटोटाइप करने की आवश्यकता है।एक विशिष्ट मामले में, आप एक ही शीर्ष लेख है कि हो सकता है या तो एक सी या सी ++ फ़ाइल में #include घ उपयोग करना चाहते हैं, तो संरचना इस तरह दिखता है:

// myheader.h 
#ifndef MY_HEADER_H_INCLUDED_ 
#define MY_HEADER_H_INCLUDED_ 

#ifdef __cplusplus 
extern "C" { 
#endif 

    int func1(void); 
    void func2(int); 

#ifdef __cplusplus 
} 
#endif 

#endif 

तो, एक सी ++ संकलक समारोह घोषणाओं देखेंगे (और typedef एस, आदि) extern "C" ब्लॉक से घिरा हुआ है, जबकि एक सी कंपाइलर प्रोटोटाइप देखेंगे, जो उस चीज़ से घिरा हुआ नहीं है जिसे पहचान नहीं है।

पहले मामले में (सी ++ फ़ंक्शंस सी से कॉल करने योग्य), आप आमतौर पर हेडर को लगभग उसी तरह से ढांचे के रूप में तैयार करेंगे, ताकि यदि आवश्यक हो तो आप उन कार्यों को C++ से भी कॉल कर सकते हैं (लेकिन इंटरफ़ेस पर, आप अभी भी सभी अतिरिक्त खो देते हैं समारोह ओवरलोडिंग की तरह सी ++ की विशेषताएं)।

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