अंतिम अद्यतन:2026-10-12
C++ extern linkage declaration¶
लेखक के बारे में:¶
व्यक्तिगत 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:
link:
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 बनाएँ।
फिर compile करें:
अगर bazel से compile करें, तो चलाएँ: bazel run basic_content/extern/extern_c++:main
और आमतौर पर C कोड को universally उपयोग करने के लिए, यानी उसे C भी कॉल कर सके और C++ भी, header फ़ाइल में आमतौर पर ऐसा लिखा जाता है:
यानी 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:
link:
उपरोक्त उदाहरण का सोर्स कोड देखें:
इन सबसे, उपयोग का तरीका निकलता है, C भाषा की header फ़ाइल में, उसके external फ़ंक्शन केवल extern टाइप निर्दिष्ट किए जा सकते हैं, C भाषा extern "C" declaration सपोर्ट नहीं करती, .c फ़ाइल में extern "C" होने पर compile syntax error आएगा। इसलिए extern "C" सब cpp प्रोग्राम से जुड़ी फ़ाइलों या उसकी header फ़ाइलों में रखें।
निम्नलिखित रूप निकलते हैं:
(1) C++ द्वारा C फ़ंक्शन कॉल:
(2) C द्वारा C++ फ़ंक्शन कॉल
हालाँकि, C++ द्वारा C इंटरफ़ेस कॉल करने से अलग, C++ सचमुच compile हो चुके C फ़ंक्शन कॉल कर सकता है, जबकि यहाँ C द्वारा C++ कॉल, सिर्फ़ C++ कोड को C कोड मानकर compile करके कॉल है। यानी, C, C++ लाइब्रेरी के फ़ंक्शन सीधे कॉल नहीं कर सकता।
संबंधित विषय¶
- C++ प्योर वर्चुअल फ़ंक्शन और एब्स्ट्रैक्ट क्लास | C++那些事
- C++ assert | C++那些事
- C++ bit-field | C++那些事
- C भाषा से C++ पॉलीमॉर्फ़िज़्म | C++那些事
- C++ const constant और qualifier | C++那些事
- C++ const परिवार | C++那些事
- C++ dereference ऑपरेटर * | C++那些事
- C++ इनिशियलाइज़ेशन और असाइनमेंट | C++那些事
- C++ multiple return values लिखने के तरीके | C++那些事
- C++ mutable कीवर्ड | C++那些事