Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> सी प्रोग्रामिंग

C++ में नाम मैंगलिंग और extern "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); // पूर्णांक
    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

नोट: ये कोड ब्लॉक अलग-अलग कंपाइलर्स में अलग-अलग परिणाम उत्पन्न कर सकते हैं।

  1. - C++ में delete() और free()

    delete()delete ऑपरेटर का उपयोग मेमोरी को डीएलोकेट करने के लिए किया जाता है। उपयोगकर्ता के पास इस delete ऑपरेटर द्वारा बनाए गए पॉइंटर वेरिएबल को डीएलोकेट करने का विशेषाधिकार होता है। C++ भाषा में delete ऑपरेटर का सिंटैक्स यहां दिया गया है, delete pointer_variable; आवंटित मेमोरी के ब्लॉक को हटाने का स

  1. - C++ और C# में अंतर

    C++ एक स्टैटिकली-टाइप्ड, कंपाइल्ड, मल्टी-पैराडाइम भाषा है (प्रोसीजरल, OOP, जेनेरिक)। C# एक मैनेज्ड, ऑब्जेक्ट-ओरिएंटेड भाषा है जो .NET पर चलती है। मुख्य अंतर पहलूC++C# मेमोरी प्रबंधनमैनुअल (new/delete, स्मार्ट पॉइंटर्स)स्वचालित (गार्बेज कलेक्शन) प्लेटफॉर्मक्रॉस-प्लेटफॉर्म (नेटिव कंपाइलेशन)मुख्य

  1. - C++ और C# में Foreach लूप

    C++ में Foreach लूप C++11 ने foreach लूप (रेंज-बेस्ड फॉर लूप) पेश किया जो कंटेनर के प्रत्येक एलिमेंट को ट्रैवर्स करता है। उदाहरण: #include <iostream> using namespace std; int main() { int myArr[] = { 99, 15, 67 }; // foreach लूप for (int ele : myArr) cout << ele << e