मैं एक ऐसी परियोजना पर काम कर रहा हूं जिसमें बहुत सी विरासत सी कोड है। हमने सी ++ में लिखना शुरू कर दिया है, आखिरकार विरासत कोड को बदलने के इरादे से, साथ ही साथ। मैं थोड़ा उलझन में हूं कि सी और सी ++ कैसे बातचीत करते हैं। मैं रैप करके समझते हैं कि सी के साथ कोड extern "C"
C ++ कम्पाइलर वध नहीं होगा सी कोड के नाम है, लेकिन मैं पूरी तरह से यकीन है कि यह कैसे लागू करने के लिए नहीं कर रहा हूँ।
इसलिए, प्रत्येक सी हेडर फ़ाइल के शीर्ष पर (गार्ड शामिल करने के बाद), हमारे पास है
#ifdef __cplusplus
extern "C" {
#endif
और सबसे नीचे, हम लिखते हैं
#ifdef __cplusplus
}
#endif
दोनों के बीच में, हमारे पास सभी प्रकार के टाइपपैड्स और फ़ंक्शन प्रोटोटाइप शामिल हैं। मेरे पास कुछ प्रश्न हैं, यह देखने के लिए कि क्या मैं इसे सही ढंग से समझ रहा हूं:
अगर मेरे पास C ++ फ़ाइल A.hh है जिसमें C हेडर फ़ाइल B शामिल है, तो एक और C हेडर फ़ाइल Ch शामिल है, यह कैसे काम करता है? मुझे लगता है कि जब कंपाइलर भ में कदम रखता
__cplusplus
है, तो इसे परिभाषित किया जाएगा, इसलिए यह कोड को इस ब्लॉक के साथ लपेटेगाextern "C"
(और__cplusplus
इसे इस ब्लॉक के अंदर परिभाषित नहीं किया जाएगा)। इसलिए, जब यह Ch में कदम रखता है, तो इसे__cplusplus
परिभाषित नहीं किया जाएगा और कोड को लपेटा नहीं जाएगाextern "C"
। क्या ये सही है?कोड का एक टुकड़ा लपेटने में कुछ गड़बड़ है
extern "C" { extern "C" { .. } }
? दूसरा क्या करेगाextern "C"
?हम .c फ़ाइलों के चारों ओर इस आवरण को डालते हैं, केवल .h फ़ाइलों के लिए। तो, क्या होता है अगर किसी फ़ंक्शन का प्रोटोटाइप नहीं है? क्या कंपाइलर को लगता है कि यह C ++ फ़ंक्शन है?
हम कुछ तृतीय-पक्ष कोड का भी उपयोग कर रहे हैं, जो C में लिखा गया है , और इसके चारों ओर इस प्रकार का आवरण नहीं है। किसी भी समय मैं उस लाइब्रेरी से एक हेडर शामिल करता हूं, मैं
extern "C"
लगभग #include डाल रहा हूं । क्या इससे निपटने का सही तरीका है?अंत में, क्या यह एक अच्छा विचार है? क्या हमें कुछ और करना चाहिए? हम अग्रगण्य भविष्य के लिए C और C ++ को मिलाते जा रहे हैं, और मैं यह सुनिश्चित करना चाहता हूं कि हम अपने सभी आधारों को कवर कर रहे हैं।