C++
लिंकेज विनिर्देशों
खोज…
परिचय
एक लिंकेज विनिर्देश संकलक को इस तरह से घोषणाओं को संकलित करने के लिए कहता है जो उन्हें किसी अन्य भाषा में लिखी गई घोषणाओं के साथ एक साथ जोड़ने की अनुमति देता है, जैसे कि सी।
वाक्य - विन्यास
- बाहरी स्ट्रिंग-शाब्दिक { घोषणा-सेक् ( ऑप्ट )}
- बाहरी स्ट्रिंग-शाब्दिक घोषणा
टिप्पणियों
मानक को C ++ के साथ संगत होने की अनुमति देने के लिए सभी extern "C"
का समर्थन करने की आवश्यकता होती है, और C, और extern "C++"
को संगत करने की अनुमति दी जाती है, जिसका उपयोग लिंकिंग विनिर्देश को घेरने और डिफ़ॉल्ट को पुनर्स्थापित करने के लिए किया जा सकता है। अन्य समर्थित लिंकेज विनिर्देश कार्यान्वयन-परिभाषित हैं ।
यूनिक्स की तरह ऑपरेटिंग सिस्टम के लिए सिग्नल हैंडलर
चूँकि एक सिग्नल हैंडलर को C कॉलिंग कन्वेंशन का उपयोग करके कर्नेल द्वारा बुलाया जाएगा, इसलिए हमें फंक्शन को कंपाइल करते समय C कॉलिंग कन्वेंशन का उपयोग करने के लिए कंपाइलर को बताना चाहिए।
volatile sig_atomic_t death_signal = 0;
extern "C" void cleanup(int signum) {
death_signal = signum;
}
int main() {
bind(...);
listen(...);
signal(SIGTERM, cleanup);
while (int fd = accept(...)) {
if (fd == -1 && errno == EINTR && death_signal) {
printf("Caught signal %d; shutting down\n", death_signal);
break;
}
// ...
}
}
C ++ के अनुरूप C लाइब्रेरी हेडर बनाना
एसी लाइब्रेरी हेडर को आमतौर पर C ++ प्रोग्राम में शामिल किया जा सकता है, क्योंकि अधिकांश घोषणाएं C और C ++ दोनों में मान्य हैं। उदाहरण के लिए, निम्नलिखित foo.h
विचार करें:
typedef struct Foo {
int bar;
} Foo;
Foo make_foo(int);
make_foo
की परिभाषा को अलग-अलग संकलित किया गया है और हेडर के साथ ऑब्जेक्ट फॉर्म में वितरित किया गया है।
एक C ++ प्रोग्राम #include <foo.h>
कर सकता है, लेकिन कंपाइलर को पता नहीं चलेगा कि make_foo
फ़ंक्शन को C प्रतीक के रूप में परिभाषित किया गया है, और संभवत: इसे एक मांगलिक नाम के साथ देखने की कोशिश करेंगे, और इसे खोजने में विफल रहेंगे। यह की परिभाषा पा सकते हैं यहां तक कि अगर make_foo
पुस्तकालय में, नहीं सभी प्लेटफार्मों C और C ++ के लिए एक ही बुला परंपराओं का उपयोग, और सी ++ संकलक सी ++ सम्मेलन बुला जब बुला उपयोग करेगा make_foo
है, जो की संभावना है एक विभाजन गलती करता है, तो पैदा करने के लिए make_foo
सी बुलाए जाने वाले सम्मेलन के साथ बुलाए जाने की उम्मीद कर रहा है।
इस समस्या को मापने का तरीका है कि हेडर में लगभग सभी घोषणाओं को extern "C"
ब्लॉक में लपेट दिया जाए।
#ifdef __cplusplus
extern "C" {
#endif
typedef struct Foo {
int bar;
} Foo;
Foo make_foo(int);
#ifdef __cplusplus
} /* end of "extern C" block */
#endif
अब जब foo.h
को C प्रोग्राम से शामिल किया जाता है, तो यह केवल साधारण घोषणाओं के रूप में दिखाई देगा, लेकिन जब foo.h
को C ++ प्रोग्राम से शामिल किया जाता है, तो make_foo
extern "C"
ब्लॉक के अंदर होगा और कंपाइलर को देखना होगा एक अनमैंगल्ड नाम और C कॉलिंग कन्वेंशन का उपयोग करें।