2009-08-18 15 views
20

संभव डुप्लिकेट:
Why do we need extern “C”{ #include <foo.h> } in C++?सी ++ में बाहरी "सी" का उपयोग कब करें?

मैं अक्सर की तरह कोडित कार्यक्रमों को देखा है:

extern "C" bool doSomeWork() { 
    // 
    return true; 
} 

क्यों हम एक extern "C" ब्लॉक प्रयोग करते हैं? क्या हम इसे सी ++ में कुछ के साथ बदल सकते हैं? extern "C" का उपयोग करने के लिए कोई फायदा है?

मुझे this समझाते हुए एक लिंक दिखाई देता है, लेकिन हमारे पास पहले से सी ++ होने पर सी में कुछ संकलित करने की आवश्यकता क्यों है?

+3

http://stackoverflow.com/questions/67894/why-do-we-need-extern-c-include-foo-h-in-c – Aamir

+0

संबंधित डुप्लिकेट: http://stackoverflow.com/questions/1041866/बाहरी-सी http://stackoverflow.com/questions/717729/does-extern-c-have-any-effect-in-c http://stackoverflow.com/questions/496448/how-to- ठीक से प्रयोग-निर्वासन-keword-इन-सी / –

उत्तर

29

बाहरी "सी" नामों को उलझन में नहीं बनाता है।

इसका उपयोग करके:

  1. हम सी में कुछ सी पुस्तकालय उपयोग करने की आवश्यकता ++

    extern "C" int foo(int); 
    
  2. हम कुछ सी निर्यात की जरूरत C++

    extern "C" int foo(int) { something; } 
    
  3. हम जरूरत के लिए कोड साझा लाइब्रेरी में प्रतीक को हल करने की क्षमता - इसलिए हमें छेड़छाड़ करने की आवश्यकता है

    extern "C" int foo(int) { something; } 
    /// 
    typedef int (*foo_type)(int); 
    foo_type f = (foo_type)dlsym(handle,"foo") 
    
10

एक जगह है जहाँ extern "सी" समझ में आता है जब आप एक पुस्तकालय है कि सी कोड के रूप में संकलित किया गया लिंक कर रहे हैं है।

extern "C" { 
    #include "c_only_header.h" 
} 

अन्यथा, आप लिंकर त्रुटियों क्योंकि पुस्तकालय सी-लिंकेज (_myfunc), लेकिन सी ++ संकलक, जो सी ++ कोड के रूप में पुस्तकालय के हेडर संसाधित साथ कार्यों में शामिल हो सकती है, उत्पन्न कार्यों के लिए सी ++ प्रतीक नाम (" _myfunc @ XAZZYE "- इसे प्रत्येक कंपाइलर के लिए मैंगलिंग और अलग कहा जाता है)।

एक और जगह जहां बाहरी "सी" का उपयोग किया जाता है, सी ++ में लिखे गए कार्यों के लिए सी लिंकेज की गारंटी भी है।

extern "C" void __stdcall PrintHello() { 
    cout << "Hello World" << endl; 
} 

ऐसे प्रकार्य एक DLL को निर्यात किया जा सकता है और फिर अन्य प्रोग्रामिंग भाषा से प्रतिदेय होगा, क्योंकि संकलन इसके नाम वध नहीं होंगे। यदि आपने एक ही फ़ंक्शन का एक और अधिभार जोड़ा है, उदाहरण के लिए।

extern "C" void __stdcall PrintHello() { 
    cout << "Hello World" << endl; 
} 
extern "C" void __stdcall PrintHello(const char *name) { 
    cout << "Hello, " << name << endl; 
} 

सबसे compilers तो यह पकड़ है और इस तरह अपने DLL-सार्वजनिक कार्यों में समारोह भार के उपयोग करने से रोका जा सके।

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