extern "सी" कैसे उत्पन्न वस्तु फ़ाइल में प्रतीकों नाम दिया जाना चाहिए निर्धारित करता है। यदि कोई फ़ंक्शन बाहरी "सी" के बिना घोषित किया गया है, तो ऑब्जेक्ट फ़ाइल में प्रतीक नाम C++ नाम मैंगलिंग का उपयोग करेगा। यहां एक उदाहरण दिया गया है। इसलिए जैसे
को देखते हुए test.c:
void foo() { }
संकलन और वस्तु फ़ाइल में प्रतीकों लिस्टिंग देता है:
$ g++ -c test.C
$ nm test.o
0000000000000000 T _Z3foov
U __gxx_personality_v0
foo समारोह वास्तव में "_Z3foov" कहा जाता है। इस स्ट्रिंग में अन्य चीजों के साथ रिटर्न प्रकार और पैरामीटर के लिए प्रकार की जानकारी होती है। आप के बजाय इस तरह test.c लिखते हैं:
extern "C" {
void foo() { }
}
फिर संकलन और प्रतीकों को देखो:
$ g++ -c test.C
$ nm test.o
U __gxx_personality_v0
0000000000000000 T foo
आप सी लिंकेज मिलता है। ऑब्जेक्ट फ़ाइल में "foo" फ़ंक्शन का नाम केवल "foo" है, और इसमें सभी फैंसी प्रकार की जानकारी नहीं है जो नाम मैंगलिंग से आता है।
आप आम तौर पर निर्वासन 'सी' के भीतर एक शीर्ष लेख शामिल {} यदि कोड है कि यह साथ चला जाता है एक सी संकलक के साथ संकलित किया गया था, लेकिन आप C++ से यह कॉल करने के लिए कोशिश कर रहे हैं। जब आप ऐसा करते हैं, तो आप संकलक को बता रहे हैं कि शीर्षलेख में सभी घोषणाएं सी लिंकेज का उपयोग करेंगी। जब आप अपने कोड लिंक करें, अपने ओ फ़ाइलें संदर्भ "foo" नहीं "_Z3fooblah" है, जो उम्मीद है कि मेल खाता है जो पुस्तकालय आप के खिलाफ लिंक कर रहे हैं में है शामिल होंगे।
अधिकांश आधुनिक पुस्तकालयों ऐसे हेडर के आसपास गार्ड डाल इतना है कि प्रतीकों सही लिंकेज के साथ घोषित कर रहे हैं। जैसे मानक हेडर का एक बहुत में आप मिल जाएगा:
#ifdef __cplusplus
extern "C" {
#endif
... declarations ...
#ifdef __cplusplus
}
#endif
यह सुनिश्चित करती है कि सी ++ कोड शीर्ष, क्या सी पुस्तकालय में है अपने वस्तु फ़ाइल मैच में प्रतीकों में शामिल है। यदि आपको पुराना है तो आपको केवल अपने सी हेडर के आस-पास बाहरी "सी" {} रखना होगा और इन गार्डों में पहले से ही नहीं है।
मैं उलझन में आप अपने प्रश्न शीर्षक में क्या मतलब है हूँ ... आप विस्तार से बता सकते हैं? –
मुझे यकीन नहीं है कि इसे और कैसे रखा जाए। क्या आपने शीर्षक से परे पढ़ा था? – Landon