बाहरी "सी" कीवर्ड का उपयोग सी ++ में फ़ंक्शन नाम बनाने के लिए किया जाता है जिसमें सी लिंकेज होता है। इस मामले में कंपाइलर फ़ंक्शन को मैनेज नहीं करता है। आइए पहले देखें कि C++ में मैंगलिंग क्या है, फिर हम बाहरी “C” कीवर्ड के बारे में चर्चा कर सकते हैं।
C++ में हम फंक्शन ओवरलोडिंग फीचर का उपयोग कर सकते हैं। इस फीचर का इस्तेमाल करके हम एक ही नाम से फंक्शन बना सकते हैं। अंतर केवल तर्कों के प्रकार और तर्कों की संख्या का है। वापसी प्रकार यहां नहीं माना जाता है। अब प्रश्न आता है कि C++ ऑब्जेक्ट कोड में अतिभारित कार्यों को कैसे अलग करता है?
ऑब्जेक्ट कोड में, यह तर्कों के बारे में जानकारी जोड़कर नाम बदलता है। यहां जिस तकनीक का प्रयोग किया जाता है, उसे नेम मैंगलिंग कहा जाता है। सी ++ में नाम मैंगलिंग के लिए कोई मानकीकृत तकनीक नहीं है। इसलिए अलग-अलग कंपाइलर अलग-अलग तकनीकों का इस्तेमाल करते हैं।
यहाँ नाम मैंगलिंग का एक उदाहरण है। अतिभारित कार्यों को func() नाम दिया गया है, और एक अन्य फ़ंक्शन my_function() है।
उदाहरण
int func(int x) { return x*x; } double func(double x) { return x*x; } void my_function(void) { int x = func(2); //integer double y = func(2.58); //double }
कुछ C++ कंपाइलर इसे नीचे की तरह बदल देंगे -
उदाहरण
int __func_i(int x){ return x*x; } double __func_d(double x){ return x*x; } void __my_function_v(void){ int x = __func_i(2); //integer double y = __func_d(2.58); //double }
सी फ़ंक्शन ओवरलोडिंग का समर्थन नहीं करता है, इसलिए हमें यह सुनिश्चित करना होगा कि जब हम सी ++ में सी कोड लिंक करते हैं तो प्रतीक का नाम नहीं बदला जाता है। निम्नलिखित C++ कोड एक त्रुटि उत्पन्न करेगा।
उदाहरण
int printf(const char *format,...); main() { printf("Hello World"); }
आउटपुट
undefined reference to `printf(char const*, ...)' ld returned 1 exit status
यह समस्या इसलिए उत्पन्न हो रही है क्योंकि प्रिंटफ () का नाम कंपाइलर द्वारा बदल दिया गया है। और यह अद्यतन प्रिंटफ () फ़ंक्शन की परिभाषा नहीं ढूंढता है। इस समस्या को दूर करने के लिए हमें C++ में एक्सटर्नल “C” का प्रयोग करना होगा। जब इस ब्लॉक के अंदर कुछ कोड का उपयोग किया जाता है, तो C++ कंपाइलर सुनिश्चित करता है कि फ़ंक्शन का नाम अनमंगल है। इसलिए नाम नहीं बदला जाएगा। तो इस समस्या को हल करने के लिए उपरोक्त कोड इस तरह होगा।
उदाहरण
extern "C"{ int printf(const char *format,...); } main() { printf("Hello World"); }
आउटपुट
Hello World
नोट: कोड के ये ब्लॉक अलग-अलग कंपाइलरों में अलग-अलग परिणाम उत्पन्न कर सकते हैं।
तो बाहरी "सी" मूल रूप से एक लिंकेज विनिर्देश है। प्रत्येक कंपाइलर में, हमें C लिंकेज को निर्दिष्ट करने के लिए इस कीवर्ड का उपयोग करना होता है। और एक और बात हमें ध्यान में रखनी होगी कि लिंकेज विनिर्देश नेमस्पेस स्कोप में होना चाहिए। कक्षा के सदस्यों को बाहरी "सी" से अनदेखा कर दिया जाता है