वास्तव extern "C"
में C ++ कोड में क्या करता है?
उदाहरण के लिए:
extern "C" {
void foo();
}
foo()
फ़ंक्शन है।
वास्तव extern "C"
में C ++ कोड में क्या करता है?
उदाहरण के लिए:
extern "C" {
void foo();
}
foo()
फ़ंक्शन है।
जवाबों:
extern "C" C ++ में एक फंक्शन-नेम बनाता है, जिसमें 'C' लिंकेज होता है (कंपाइलर नाम नहीं बताता है) ताकि क्लाइंट C कोड 'C' संगत हेडर फाइल का उपयोग करके आपके फंक्शन को लिंक कर सके (यानी उपयोग कर सके) जिसमें सिर्फ 'सी' हो अपने कार्य की घोषणा। आपकी फ़ंक्शन परिभाषा एक बाइनरी प्रारूप में सम्मिलित है (जो आपके C ++ कंपाइलर द्वारा संकलित की गई थी) कि क्लाइंट 'C' लिंकर फिर 'C' नाम का उपयोग करने के लिए लिंक करेगा।
चूंकि C ++ में फ़ंक्शन नामों का ओवरलोडिंग है और C नहीं है, इसलिए C ++ कंपाइलर फ़ंक्शन नाम को लिंक करने के लिए एक अद्वितीय आईडी के रूप में उपयोग नहीं कर सकता है, इसलिए यह तर्कों के बारे में जानकारी जोड़कर नाम का प्रबंधन करता है। AC कंपाइलर को नाम को मेन्यू करने की आवश्यकता नहीं है क्योंकि आप C. में फ़ंक्शन नामों को अधिभार नहीं दे सकते हैं। जब आप कहते हैं कि एक फ़ंक्शन C ++ में बाहरी "C" लिंकेज है, तो C ++ कंपाइलर उपयोग किए गए नाम के लिए तर्क / पैरामीटर प्रकार की जानकारी नहीं जोड़ता है। लिंकेज।
बस इतना पता है, आप स्पष्ट रूप से प्रत्येक व्यक्ति घोषणा / परिभाषा के लिए "सी" लिंकेज निर्दिष्ट कर सकते हैं या एक निश्चित लिंकेज करने के लिए घोषणाओं / परिभाषाओं के अनुक्रम को समूह के लिए ब्लॉक का उपयोग कर सकते हैं:
extern "C" void foo(int);
extern "C"
{
void g(char);
int i;
}
यदि आप तकनीकी के बारे में परवाह करते हैं, तो वे सी ++ 03 मानक के खंड 7.5 में सूचीबद्ध हैं, यहां एक संक्षिप्त सारांश है (बाहरी "सी" पर जोर देने के साथ):
extern "C" { int i; }
एक परिभाषा है। यह वह नहीं हो सकता है जिसका आपने इरादा किया था, की गैर-परिभाषा के बगल में void g(char);
। इसे एक गैर-परिभाषा बनाने के लिए, आपको आवश्यकता होगी extern "C" { extern int i; }
। दूसरी ओर, ब्रेसिज़ के बिना एक-घोषणा सिंटैक्स घोषणा को एक गैर-परिभाषा extern "C" int i;
extern "C" { extern int i; }
बस थोड़ी जानकारी जोड़ना चाहता था, क्योंकि मैंने इसे अभी तक पोस्ट नहीं किया है।
आप बहुत बार सी हेडर में कोड देखेंगे जैसे:
#ifdef __cplusplus
extern "C" {
#endif
// all of your legacy C code here
#ifdef __cplusplus
}
#endif
यह क्या पूरा करता है यह आपको अपने सी ++ कोड के साथ उस सी हेडर फ़ाइल का उपयोग करने की अनुमति देता है, क्योंकि मैक्रो "__cplusplus" को परिभाषित किया जाएगा। लेकिन आप अभी भी इसे अपनी विरासत सी कोड के साथ उपयोग कर सकते हैं , जहां मैक्रो को परिभाषित नहीं किया गया है, इसलिए यह विशिष्ट सी ++ निर्माण नहीं देखेगा।
हालाँकि, मैंने C ++ कोड भी देखा है जैसे:
extern "C" {
#include "legacy_C_header.h"
}
जिसकी मैं कल्पना करता हूं, वही बात पूरी करती है।
निश्चित नहीं है कि कौन सा तरीका बेहतर है, लेकिन मैंने दोनों को देखा है।
extern "C"
हेडर में देखा गया है)। यह महान काम करता है, इस तकनीक का कई बार उपयोग किया है।
extern "C"
हेडर को शामिल करने से पहले या बाद में सामना करता है। जब तक यह संकलक तक पहुंचता है, तब तक यह प्रीप्रोसेड पाठ की सिर्फ एक लंबी धारा है।
g++
कम से कम पिछले 17 साल में यह गलत है, किसी भी लक्ष्य के लिए, किसी भी समय। पहले उदाहरण का पूरा बिंदु यह है कि इससे कोई फर्क नहीं पड़ता कि आप C या C ++ कंपाइलर का उपयोग करते हैं, extern "C"
ब्लॉक में नामों के लिए कोई नाम नहीं लिया जाएगा ।
g++
क्या हो रहा है यह देखने के लिए एक उत्पन्न बाइनरी को डिकम्पाइल करें
main.cpp
void f() {}
void g();
extern "C" {
void ef() {}
void eg();
}
/* Prevent g and eg from being optimized away. */
void h() { g(); eg(); }
संकलित और उत्पन्न ELF आउटपुट को अलग करें :
g++ -c -std=c++11 -Wall -Wextra -pedantic -o main.o main.cpp
readelf -s main.o
आउटपुट में शामिल हैं:
8: 0000000000000000 7 FUNC GLOBAL DEFAULT 1 _Z1fv
9: 0000000000000007 7 FUNC GLOBAL DEFAULT 1 ef
10: 000000000000000e 17 FUNC GLOBAL DEFAULT 1 _Z1hv
11: 0000000000000000 0 NOTYPE GLOBAL DEFAULT UND _GLOBAL_OFFSET_TABLE_
12: 0000000000000000 0 NOTYPE GLOBAL DEFAULT UND _Z1gv
13: 0000000000000000 0 NOTYPE GLOBAL DEFAULT UND eg
व्याख्या
हम देखते है कि:
ef
और eg
कोड में समान नाम के साथ प्रतीकों में संग्रहीत किए गए थे
अन्य प्रतीकों मंगाई गई थीं। आइए उन्हें अनमंगल करें:
$ c++filt _Z1fv
f()
$ c++filt _Z1hv
h()
$ c++filt _Z1gv
g()
निष्कर्ष: निम्नलिखित दोनों प्रकार के प्रतीक प्रकार नहीं थे :
Ndx = UND
), किसी अन्य ऑब्जेक्ट फ़ाइल से लिंक पर चलाने या चलाने के लिए प्रदान किया जाएगाइसलिए आपको extern "C"
कॉल करते समय दोनों की आवश्यकता होगी :
g++
द्वारा उत्पादित अनमैंगल्ड प्रतीकों की अपेक्षा करनाgcc
g++
लिए अनमैन्डल प्रतीक उत्पन्न करना बताएंgcc
बाहरी सी में काम नहीं करने वाली चीजें
यह स्पष्ट हो जाता है कि किसी भी C ++ सुविधा के लिए जिसे नाम की आवश्यकता है, अंदर काम नहीं करेगी extern C
:
extern "C" {
// Overloading.
// error: declaration of C function ‘void f(int)’ conflicts with
void f();
void f(int i);
// Templates.
// error: template with C linkage
template <class C> void f(C i) { }
}
C ++ उदाहरण से न्यूनतम रनवेबल C
पूर्णता के लिए और वहाँ से बाहर के newbs के लिए, यह भी देखें: C ++ प्रोजेक्ट में C स्रोत फ़ाइलों का उपयोग कैसे करें?
C ++ से C को कॉल करना बहुत आसान है: प्रत्येक C फ़ंक्शन में केवल एक संभव गैर-मैनगल्ड प्रतीक है, इसलिए किसी अतिरिक्त कार्य की आवश्यकता नहीं है।
main.cpp
#include <cassert>
#include "c.h"
int main() {
assert(f() == 1);
}
ch
#ifndef C_H
#define C_H
/* This ifdef allows the header to be used from both C and C++
* because C does not know what this extern "C" thing is. */
#ifdef __cplusplus
extern "C" {
#endif
int f();
#ifdef __cplusplus
}
#endif
#endif
सीसी
#include "c.h"
int f(void) { return 1; }
Daud:
g++ -c -o main.o -std=c++98 main.cpp
gcc -c -o c.o -std=c89 c.c
g++ -o main.out main.o c.o
./main.out
extern "C"
लिंक के बिना के साथ विफल रहता है:
main.cpp:6: undefined reference to `f()'
क्योंकि g++
एक मंगली को खोजने की उम्मीद है f
, जो gcc
उत्पन्न नहीं हुई।
C के उदाहरण से न्यूनतम रन योग्य C ++
C से C ++ को कॉल करना थोड़ा कठिन है: हमें प्रत्येक फ़ंक्शन के गैर-मैंगल्ड संस्करण को मैन्युअल रूप से बनाना होगा जिसे हम उजागर करना चाहते हैं।
यहाँ हम बताते हैं कि C ++ फंक्शन ओवरलोड को C में कैसे एक्सपोज़ किया जाए।
main.c
#include <assert.h>
#include "cpp.h"
int main(void) {
assert(f_int(1) == 2);
assert(f_float(1.0) == 3);
return 0;
}
cpp.h
#ifndef CPP_H
#define CPP_H
#ifdef __cplusplus
// C cannot see these overloaded prototypes, or else it would get confused.
int f(int i);
int f(float i);
extern "C" {
#endif
int f_int(int i);
int f_float(float i);
#ifdef __cplusplus
}
#endif
#endif
cpp.cpp
#include "cpp.h"
int f(int i) {
return i + 1;
}
int f(float i) {
return i + 2;
}
int f_int(int i) {
return f(i);
}
int f_float(float i) {
return f(i);
}
Daud:
gcc -c -o main.o -std=c89 -Wextra main.c
g++ -c -o cpp.o -std=c++98 cpp.cpp
g++ -o main.out main.o cpp.o
./main.out
इसके बिना extern "C"
विफल रहता है:
main.c:6: undefined reference to `f_int'
main.c:7: undefined reference to `f_float'
क्योंकि g++
उत्पन्न प्रतीक जो gcc
नहीं मिल सकते हैं।
उबुन्टु 18.04 में परीक्षण किया गया।
extern "C" {
आपको C ++ प्रोग्रामों के भीतर से अनमैन्डल सी फ़ंक्शन को कॉल करने में मदद करता है , साथ ही सी प्रोग्राम्स के भीतर से अनमैन्डल सी ++ फ़ंक्शंस , जो अन्य उत्तर इतने स्पष्ट नहीं हैं, और 2) क्योंकि आप अलग-अलग उदाहरण दिखाते हैं से प्रत्येक। धन्यवाद!
प्रत्येक C ++ प्रोग्राम में, सभी गैर-स्थिर कार्यों को बाइनरी फ़ाइल में प्रतीकों के रूप में दर्शाया गया है। ये प्रतीक विशेष पाठ तार हैं जो विशिष्ट रूप से कार्यक्रम में एक समारोह की पहचान करते हैं।
सी में, प्रतीक नाम फ़ंक्शन नाम के समान है। यह संभव है क्योंकि C में दो गैर-स्थैतिक कार्यों का एक ही नाम नहीं हो सकता है।
क्योंकि C ++ ओवरलोडिंग की अनुमति देता है और इसमें कई विशेषताएं हैं जो C नहीं करता है - जैसे कक्षाएं, सदस्य फ़ंक्शन, अपवाद विनिर्देशों - यह केवल फ़ंक्शन नाम का उपयोग प्रतीक नाम के रूप में करना संभव नहीं है। इसे हल करने के लिए, C ++ तथाकथित नाम मैनलिंग का उपयोग करता है, जो फ़ंक्शन नाम और सभी आवश्यक जानकारी (जैसे तर्कों की संख्या और आकार) को कुछ अजीब दिखने वाले स्ट्रिंग में केवल संकलक और लिंकर द्वारा संसाधित करता है।
इसलिए यदि आप किसी फ़ंक्शन को एक्सटर्नल C होने के लिए निर्दिष्ट करते हैं, तो कंपाइलर उसके साथ नाम जुड़ने का कार्य नहीं करता है और इसे फ़ंक्शन नाम के रूप में इसके प्रतीक नाम का उपयोग करके सीधे एक्सेस किया जा सकता है।
इस तरह के कार्यों का उपयोग करने dlsym()
और dlopen()
कॉल करने के दौरान यह काम आता है।
अधिकांश प्रोग्रामिंग भाषाओं को मौजूदा प्रोग्रामिंग भाषाओं के शीर्ष पर नहीं बनाया गया है। C ++ C के ऊपर बनाया गया है, और इसके अलावा यह एक प्रक्रिया-आधारित प्रोग्रामिंग भाषा से निर्मित एक वस्तु-उन्मुख प्रोग्रामिंग भाषा है, और इस कारण से C ++ के भाव हैं जैसे extern "C"
कि C के साथ पीछे की संगतता प्रदान करते हैं।
आइए निम्नलिखित उदाहरण देखें:
#include <stdio.h>
// Two functions are defined with the same name
// but have different parameters
void printMe(int a) {
printf("int: %i\n", a);
}
void printMe(char a) {
printf("char: %c\n", a);
}
int main() {
printMe("a");
printMe(1);
return 0;
}
एसी कंपाइलर उपरोक्त उदाहरण को संकलित नहीं करेगा, क्योंकि एक ही फ़ंक्शन printMe
को दो बार परिभाषित किया जाता है (भले ही उनके अलग-अलग पैरामीटर int a
बनाम हों char a
)।
gcc -o printMe PrintMe.c &&/printMe;
1 त्रुटि। PrintMe को एक से अधिक बार परिभाषित किया गया है।
एक C ++ कंपाइलर उपरोक्त उदाहरण को संकलित करेगा। यह परवाह नहीं करता है कि printMe
दो बार परिभाषित किया गया है।
g ++ -o PrintMe PrintMe.c &&/printMe;
इसका कारण यह है कि C ++ कंपाइलर अपने मापदंडों के आधार पर अनुमानित नाम ( मंगल ) फ़ंक्शन करता है। सी में, यह सुविधा समर्थित नहीं थी। हालाँकि, जब C ++ C के ऊपर बनाया गया था, तो भाषा को ऑब्जेक्ट-ओरिएंटेड डिज़ाइन किया गया था, और एक ही नाम के तरीकों (कार्यों) के साथ अलग-अलग कक्षाएं बनाने की क्षमता का समर्थन करने की आवश्यकता थी, और अलग-अलग तरीकों ( ओवरराइडिंग ) के आधार पर अलग- अलग करने की क्षमता मापदंडों।
extern "C"
कहते हैं, "सी फ़ंक्शन के नाम को कम न करें"हालाँकि, कल्पना करें कि हमारे पास "parent.c" नाम की एक विरासत सी फ़ाइल है, जो include
अन्य विरासत C फ़ाइलों, "parent.h", "child.h", आदि से नामों का कार्य करती है। यदि विरासत "parent.c" फ़ाइल चलती है C ++ कंपाइलर के माध्यम से, फिर फंक्शन के नामों को मंगवा लिया जाएगा, और वे अब "parent.h", "child.h", आदि में निर्दिष्ट फ़ंक्शन नामों से मेल नहीं खाएंगे - इसलिए उन बाहरी फ़ाइलों में फ़ंक्शन के नामों की भी आवश्यकता होगी मंगली होना। एक जटिल सी प्रोग्राम में मंगलिंग फ़ंक्शन के नाम, बहुत सारी निर्भरता वाले लोग, टूटे हुए कोड को जन्म दे सकते हैं; इसलिए यह एक कीवर्ड प्रदान करने के लिए सुविधाजनक हो सकता है जो C ++ कंपाइलर को फ़ंक्शन नाम का उपयोग न करने के लिए कह सकता है।
extern "C"
कीवर्ड एक सी ++ संकलक बताता को वध करना (नाम बदलने) सी समारोह नहीं नाम।
उदाहरण के लिए:
extern "C" void printMe(int a);
extern "C"
अगर हमारे पास सिर्फ एक dll
फाइल है तो क्या हम उसका उपयोग नहीं कर सकते ? मेरा मतलब है कि अगर हमारे पास हेडर फ़ाइल नहीं है और सिर्फ एक स्रोत फ़ाइल (सिर्फ कार्यान्वयन) है और फ़ंक्शन पॉइंटर के माध्यम से इसके फ़ंक्शन का उपयोग किया जाता है। इस अवस्था में, हम केवल फ़ंक्शन का उपयोग करते हैं (इसके नाम की परवाह किए बिना)।
एक्सटर्नल "C" में केवल रैप करके किसी भी C- हेडर को C ++ के साथ संगत नहीं बनाया जा सकता है। C ++ कीवर्ड के साथ C- हेडर संघर्ष में पहचानकर्ता जब C ++ कंपाइलर इस बारे में शिकायत करेंगे।
उदाहरण के लिए, मैंने निम्न कोड को g ++ में विफल देखा है:
extern "C" {
struct method {
int virtual;
};
}
किंडा समझ में आता है, लेकिन सी-कोड को सी ++ में पोर्ट करते समय कुछ ध्यान में रखना है।
extern "C"
सी लिंकेज का उपयोग करने का मतलब है, जैसा कि अन्य उत्तरों द्वारा वर्णित है। इसका मतलब यह नहीं है कि "सामग्री को सी" या कुछ भी संकलित करें। int virtual;
C ++ में अमान्य है और विभिन्न लिंकेज निर्दिष्ट करने से वह परिवर्तित नहीं होता है।
यह एक फ़ंक्शन के लिंकेज को इस तरह से बदलता है कि फ़ंक्शन सी से कॉल करने योग्य है। व्यवहार में इसका मतलब है कि फ़ंक्शन का नाम मैनडाउन नहीं है ।
undname
।
यह सी + + कंपाइलर को लिंक करते समय सी-स्टाइल में उन कार्यों के नामों को देखने के लिए सूचित करता है, क्योंकि लिंकिंग चरण के दौरान सी और सी ++ में संकलित कार्यों के नाम अलग-अलग हैं।
मैंने dll (डायनामिक लिंक लाइब्रेरी) फ़ाइलों को मुख्य () फंक्शन "एक्सपोर्टेबल" बनाने के लिए 'extern "C" का उपयोग किया है, इसलिए इसका उपयोग बाद में dll से अन्य निष्पादन योग्य में किया जा सकता है। शायद इसका एक उदाहरण जहां मैं इसका उपयोग करता था वह उपयोगी हो सकता है।
DLL
#include <string.h>
#include <windows.h>
using namespace std;
#define DLL extern "C" __declspec(dllexport)
//I defined DLL for dllexport function
DLL main ()
{
MessageBox(NULL,"Hi from DLL","DLL",MB_OK);
}
प्रोग्राम फ़ाइल
#include <string.h>
#include <windows.h>
using namespace std;
typedef LPVOID (WINAPI*Function)();//make a placeholder for function from dll
Function mainDLLFunc;//make a variable for function placeholder
int main()
{
char winDir[MAX_PATH];//will hold path of above dll
GetCurrentDirectory(sizeof(winDir),winDir);//dll is in same dir as exe
strcat(winDir,"\\exmple.dll");//concentrate dll name with path
HINSTANCE DLL = LoadLibrary(winDir);//load example dll
if(DLL==NULL)
{
FreeLibrary((HMODULE)DLL);//if load fails exit
return 0;
}
mainDLLFunc=(Function)GetProcAddress((HMODULE)DLL, "main");
//defined variable is used to assign a function from dll
//GetProcAddress is used to locate function with pre defined extern name "DLL"
//and matcing function name
if(mainDLLFunc==NULL)
{
FreeLibrary((HMODULE)DLL);//if it fails exit
return 0;
}
mainDLLFunc();//run exported function
FreeLibrary((HMODULE)DLL);
}
extern "C"
और __declspec(dllexport)
असंबंधित हैं। पूर्व नियंत्रण प्रतीक सजावट को नियंत्रित करता है, बाद वाला निर्यात प्रविष्टि बनाने के लिए जिम्मेदार है। आप C ++ नाम की सजावट का उपयोग करके एक प्रतीक का निर्यात कर सकते हैं। इस प्रश्न के बिंदु को पूरी तरह से गायब करने के अलावा, कोड नमूने में अन्य गलतियाँ भी हैं। एक के लिए, main
आपके DLL से निर्यात किया गया वापसी मूल्य घोषित नहीं करता है। या उस मामले के लिए सम्मेलन बुला रहा है। आयात करते समय, आप एक यादृच्छिक कॉलिंग कन्वेंशन ( WINAPI
) का उपयोग करते हैं, और 32-बिट बिल्ड (होना चाहिए _main
या _main@0
) के लिए गलत प्रतीक का उपयोग करें । क्षमा करें, -1।
void*
करता है, लेकिन आपका कार्यान्वयन कुछ भी वापस नहीं करता है। यह वास्तव में अच्छी तरह से उड़ जाएगा ...
extern "C"
एक लिंकेज विनिर्देश है जिसका उपयोग C फंक्शन सोर्स C फ़ाइलों में कॉल करने के लिए किया जाता है । हम C फ़ंक्शन को कॉल कर सकते हैं , वेरिएबल्स लिख सकते हैं , और हेडर शामिल कर सकते हैं । समारोह बाहरी इकाई में घोषित किया गया है और इसे बाहर परिभाषित किया गया है। सिंटेक्स है
श्रेणी 1:
extern "language" function-prototype
टाइप 2:
extern "language"
{
function-prototype
};
उदाहरण के लिए:
#include<iostream>
using namespace std;
extern "C"
{
#include<stdio.h> // Include C Header
int n; // Declare a Variable
void func(int,int); // Declare a function (function prototype)
}
int main()
{
func(int a, int b); // Calling function . . .
return 0;
}
// Function definition . . .
void func(int m, int n)
{
//
//
}
यह उत्तर अधीर के लिए है / मिलने की समय सीमा है, केवल एक भाग / सरल विवरण नीचे है:
इसलिए
C ++ में, प्रत्येक फ़ंक्शन को विशिष्ट रूप से पहचानने वाले नाम के साथ
को विशिष्ट रूप से पहचानने वाले नाम के साथ, C में को विशिष्ट पहचान के नाम के बिना भी C में
C ++ के व्यवहार को बदलने के लिए, अर्थात्, यह निर्दिष्ट करने के लिए कि नामकरण किसी विशेष कार्य के लिए नहीं होना चाहिए , आप फ़ंक्शन के नाम से पहले "C" का उपयोग कर सकते हैं , जो भी कारण हो, जैसे dll से एक विशिष्ट नाम के साथ फ़ंक्शन निर्यात करना। , अपने ग्राहकों द्वारा उपयोग के लिए।
अधिक विस्तृत / अधिक सही उत्तरों के लिए अन्य उत्तर पढ़ें।
C और C ++ को मिलाते समय (यानी, A, C फ़ंक्शन को C ++ से; और b को C से C ++ फ़ंक्शन को मिलाते हुए), C ++ नाम की मैनलिंग समस्याओं को जोड़ने का कारण बनती है। तकनीकी रूप से, यह समस्या केवल तब होती है जब कैली फ़ंक्शन पहले से कंपाइलर का उपयोग करके द्विआधारी (सबसे अधिक संभावना है, * .A लाइब्रेरी फ़ाइल) में संकलित किया गया है।
इसलिए हमें C ++ में नामकरण को अक्षम करने के लिए बाहरी "C" का उपयोग करने की आवश्यकता है।
अन्य अच्छे उत्तरों के साथ संघर्ष किए बिना, मैं अपने उदाहरण का एक सा जोड़ दूंगा।
वास्तव में C ++ कंपाइलर क्या करता है: यह संकलन प्रक्रिया में नामों का प्रबंधन करता है, इसलिए हमें संकलक को विशेष रूप से कार्यान्वयन का इलाज C
करने की आवश्यकता है ।
जब हम C ++ क्लासेस बना रहे हैं और जोड़ extern "C"
रहे हैं, तो हम अपने C ++ कंपाइलर को बता रहे हैं कि हम C कॉलिंग कन्वेंशन का उपयोग कर रहे हैं।
कारण (हम C ++ से C कार्यान्वयन कह रहे हैं): या तो हम C फ़ंक्शन को C ++ से कॉल करना चाहते हैं या C ++ फ़ंक्शन को C (C ++ वर्ग ... आदि) C से काम नहीं करना चाहते हैं।
C संकलक द्वारा संकलित एक फ़ंक्शन v (f) और C ++ संकलक द्वारा संकलित समान नाम v (f) के साथ एक फ़ंक्शन समान फ़ंक्शन नहीं है। यदि आपने उस फ़ंक्शन को C में लिखा है, और फिर आपने उसे C ++ से कॉल करने का प्रयास किया, तो लिंकर C ++ फ़ंक्शन की तलाश करेगा और C फ़ंक्शन को नहीं खोजेगा।
extern "C" C ++ कंपाइलर को बताता है कि आपके पास एक फ़ंक्शन है जो C कंपाइलर द्वारा संकलित किया गया था। एक बार जब आप यह बता देते हैं कि यह सी कंपाइलर द्वारा संकलित किया गया था, तो सी ++ कंपाइलर को पता चल जाएगा कि इसे सही तरीके से कैसे कॉल किया जाए।
यह C ++ कंपाइलर को C ++ फ़ंक्शन को इस तरह से संकलित करने की अनुमति देता है कि C कंपाइलर इसे कॉल कर सके। यह फ़ंक्शन आधिकारिक तौर पर एक C फ़ंक्शन होगा, लेकिन चूंकि यह C ++ कंपाइलर द्वारा संकलित किया गया है, इसलिए यह सभी C ++ सुविधाओं का उपयोग कर सकता है और इसमें सभी C ++ कीवर्ड हैं।
extern "C"
फ़ंक्शन को संकलित कर सकता है - और (कुछ बाधाओं के अधीन) यह C कंपाइलर द्वारा संकलित कोड द्वारा कॉल करने योग्य होगा।