विषय पर बढ़ें

अंतिम अद्यतन:2026-10-12

C++ extern linkage declaration

लेखक के बारे में:

व्यक्तिगत WeChat सार्वजनिक अकाउंट:

wechat

1.C++ और C के compile में अंतर

C++ में header फ़ाइलों में अक्सर extern "C" से qualify किए फ़ंक्शन दिखते हैं, उसका क्या काम है? यह C++ द्वारा C भाषा के module में परिभाषित फ़ंक्शन को link करने के लिए है।

C++ भले C के साथ compatible है, लेकिन C++ फ़ाइल में फ़ंक्शन compile होने के बाद बनने वाला symbol C भाषा से बनने वाले से अलग होता है। क्योंकि C++ function overloading सपोर्ट करता है, C++ फ़ंक्शन compile होने के बाद बनने वाले symbol में फ़ंक्शन पैरामीटर टाइप की जानकारी होती है, जबकि C में नहीं।

उदाहरण के लिए int add(int a, int b) फ़ंक्शन C++ कंपाइलर से .o फ़ाइल बनने के बाद, add, add_int_int जैसा हो जाता है, जबकि C में _add जैसा, यानी: एक जैसा फ़ंक्शन, C और C++ में compile होने के बाद अलग symbol बनाता है।

इससे एक समस्या आती है: अगर C++ में C भाषा से implement किया फ़ंक्शन उपयोग करें, तो compile/link के समय error आएगा, corresponding symbol नहीं मिलने का संदेश। यहीं extern "C" काम आता है: linker को बताता है कि add जैसे C भाषा के symbol खोजे, C++ सेmangled हुए symbol नहीं।

2.C++ द्वारा C फ़ंक्शन कॉल

C++ द्वारा C फ़ंक्शन कॉल का उदाहरण: C की header फ़ाइल refer करते समय extern "C" जोड़ना होगा

//add.h
#ifndef ADD_H
#define ADD_H
int add(int x,int y);
#endif

//add.c
#include "add.h"

int add(int x,int y) {
    return x+y;
}

//add.cpp
#include <iostream>
#include "add.h"
using namespace std;
int main() {
    add(2,3);
    return 0;
}

compile:

//Generate add.o file
gcc -c add.c

link:

g++ add.cpp add.o -o main

extern "C" न जोड़ने पर error:

> g++ add.cpp add.o -o main                                   
add.o:在函数‘main’中:
add.cpp:(.text+0x0): `main'被多次定义
/tmp/ccH65yQF.o:add.cpp:(.text+0x0):第一次在此定义
/tmp/ccH65yQF.o:在函数‘main’中:
add.cpp:(.text+0xf):对‘add(int, int)’未定义的引用
add.o:在函数‘main’中:
add.cpp:(.text+0xf):对‘add(int, int)’未定义的引用
collect2: error: ld returned 1 exit status

extern "C" जोड़ने के बाद:

add.cpp

#include <iostream>
using namespace std;
extern "C" {
    #include "add.h"
}
int main() {
    std::cout << add(2, 3) << std::endl;
    return 0;
}

compile करते समय ध्यान रखें, पहले gcc से intermediate फ़ाइल add.o बनाएँ।

gcc -c add.c 

फिर compile करें:

g++ add.cpp add.o -o main

अगर bazel से compile करें, तो चलाएँ: bazel run basic_content/extern/extern_c++:main

और आमतौर पर C कोड को universally उपयोग करने के लिए, यानी उसे C भी कॉल कर सके और C++ भी, header फ़ाइल में आमतौर पर ऐसा लिखा जाता है:

#ifdef __cplusplus
extern "C"{
#endif
int add(int x,int y);
#ifdef __cplusplus
}
#endif

यानी C++ इस इंटरफ़ेस को कॉल करते समय, C इंटरफ़ेस की तरह कॉल करेगा। इस तरीके से C++ वाले को अतिरिक्त extern C की ज़रूरत नहीं, स्टैंडर्ड लाइब्रेरी की header फ़ाइलों में भी ऐसा ही है, वरना आप extern C के बिना stdio.h के C फ़ंक्शन सीधे कैसे उपयोग कर पाते?

उपरोक्त उदाहरण का सोर्स कोड देखें:

2.C में C++ फ़ंक्शन कॉल

extern "C" C में syntax error है, इसे C++ की header फ़ाइल में रखना होगा।

// add.h
#ifndef ADD_H
#define ADD_H
extern "C" {
    int add(int x,int y);
}
#endif

// add.cpp
#include "add.h"

int add(int x,int y) {
    return x+y;
}

// add.c
extern int add(int x,int y);
int main() {
    add(2,3);
    return 0;
}

compile:

g++ -c add.cpp

link:

gcc add.c add.o -o main

उपरोक्त उदाहरण का सोर्स कोड देखें:

इन सबसे, उपयोग का तरीका निकलता है, C भाषा की header फ़ाइल में, उसके external फ़ंक्शन केवल extern टाइप निर्दिष्ट किए जा सकते हैं, C भाषा extern "C" declaration सपोर्ट नहीं करती, .c फ़ाइल में extern "C" होने पर compile syntax error आएगा। इसलिए extern "C" सब cpp प्रोग्राम से जुड़ी फ़ाइलों या उसकी header फ़ाइलों में रखें।

निम्नलिखित रूप निकलते हैं:

(1) C++ द्वारा C फ़ंक्शन कॉल:

//xx.h
extern int add(...)

//xx.c
int add(){

}

//xx.cpp
extern "C" {
    #include "xx.h"
}

(2) C द्वारा C++ फ़ंक्शन कॉल

//xx.h
extern "C"{
    int add();
}
//xx.cpp
int add(){

}
//xx.c
extern int add();

हालाँकि, C++ द्वारा C इंटरफ़ेस कॉल करने से अलग, C++ सचमुच compile हो चुके C फ़ंक्शन कॉल कर सकता है, जबकि यहाँ C द्वारा C++ कॉल, सिर्फ़ C++ कोड को C कोड मानकर compile करके कॉल है। यानी, C, C++ लाइब्रेरी के फ़ंक्शन सीधे कॉल नहीं कर सकता।

संबंधित विषय

टिप्पणियाँ