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); // पूर्णांक
double y = func(2.58); // डबल
}
कुछ 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); // पूर्णांक
double y = __func_d(2.58); // डबल
}
C फ़ंक्शन ओवरलोडिंग का समर्थन नहीं करता, इसलिए हमें यह सुनिश्चित करना होगा कि जब हम C कोड को C++ में लिंक करते हैं तो सिंबल का नाम न बदले। निम्न C++ कोड त्रुटि उत्पन्न करेगा।
उदाहरण
int printf(const char *format,...);
int main() {
printf("Hello World");
}
आउटपुट
undefined reference to `printf(char const*, ...)' ld returned 1 exit status
यह समस्या इसलिए उत्पन्न हो रही है क्योंकि कंपाइलर द्वारा printf() का नाम बदल दिया गया है। और यह अपडेटेड printf() फ़ंक्शन की परिभाषा नहीं ढूंढ पाता। इस समस्या को दूर करने के लिए हमें C++ में extern "C" का उपयोग करना होगा। जब कुछ कोड इस ब्लॉक के अंदर उपयोग किया जाता है, तो C++ कंपाइलर यह सुनिश्चित करता है कि फ़ंक्शन नाम अनमैंगल्ड रहे। इसलिए नाम नहीं बदलेगा। इसलिए उपरोक्त कोड इस तरह होगा:
उदाहरण
extern "C" {
int printf(const char *format,...);
}
int main() {
printf("Hello World");
}
आउटपुट
Hello World
नोट: ये कोड ब्लॉक अलग-अलग कंपाइलर्स में अलग-अलग परिणाम उत्पन्न कर सकते हैं।