Extern C और C ABI
extern C से C++ libraries के C-compatible interfaces उपलब्ध कराएँ।
Extern C और C ABI, CoddyKit पर C++ Academy का एक निःशुल्क पाठ है। यह 4 में से 1वाँ पाठ है। इस अध्ययन पथ के 3 तक कोई भी पाठ पूरा पढ़ना निःशुल्क है — इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ व्यावहारिक अभ्यास भी उपलब्ध कराता है। यह C++ Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। C++ Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
इंटरऑपरेशन क्यों?
C++ में नाम मैंगलिंग, अपवादों और टेम्पलेट के साथ एक जटिल ABI (एप्लिकेशन बाइनरी इंटरफ़ेस) होता है। अन्य भाषाएँ (C, Python, Rust) मैंगल किए गए C++ प्रतीकों का सीधे उपयोग नहीं कर सकतीं।
extern "C"
नाम मैंगलिंग अक्षम करने और C कॉलिंग कन्वेंशन का उपयोग करने के लिए घोषणाओं को extern "C" में रखें।
extern "C" {
void greet(const char* name);
int add(int a, int b);
}C ABI क्यों?
C ABI भाषाओं के बीच सबसे सामान्य आधार है। लगभग हर भाषा FFI के माध्यम से C फ़ंक्शन कॉल कर सकती है।
हेडर फ़ाइल का पैटर्न
सशर्त extern "C" के साथ ऐसा हेडर बनाएँ जिसका उपयोग C और C++ दोनों से किया जा सके।
#ifdef __cplusplus
extern "C" {
#endif
void hello(void);
int sum(int a, int b);
#ifdef __cplusplus
}
#endifआप क्या एक्सपोर्ट नहीं कर सकते
C++ की कुछ सुविधाओं का C में कोई समकक्ष नहीं है:
- क्लास (C में क्लास की कोई अवधारणा नहीं)
- टेम्पलेट (कंपाइल समय पर हल होते हैं, एक्सपोर्ट नहीं किए जा सकते)
- ओवरलोड किए गए फ़ंक्शन (नाम मैंगलिंग के बिना ओवरलोडिंग संभव नहीं)
- अपवाद (FFI पार करने से पहले पकड़े जाने चाहिए)
क्लास को उजागर करना
अपारदर्शी पॉइंटर और C-शैली के API के पीछे क्लास को छिपाएँ।
// header (C visible)
typedef struct Widget Widget;
Widget* widget_create(int x);
void widget_destroy(Widget*);
int widget_value(const Widget*);
// .cpp
class WidgetImpl { /* ... */ };
extern "C" {
Widget* widget_create(int x) { return reinterpret_cast<Widget*>(new WidgetImpl(x)); }
void widget_destroy(Widget* w) { delete reinterpret_cast<WidgetImpl*>(w); }
}FFI के पार अपवादों से बचें
C के माध्यम से कॉल किए गए C++ फ़ंक्शन से फेंका गया अपवाद प्रोग्राम को बंद कर देगा। सीमा पर उसे पकड़ें।
extern "C" int safe_call() {
try {
risky();
return 0;
} catch (...) {
return -1;
}
}मेमोरी का स्वामित्व
दस्तावेज़ित करें कि किसके पास किस चीज़ का स्वामित्व है — आमतौर पर जो पक्ष आवंटन करता है, वही उसे मुक्त करता है। असंगतियों से मेमोरी लीक या दोहरे मुक्तिकरण की समस्या होती है।
FFI के पार स्ट्रिंग
std::string केवल C++ के लिए है। FFI के पार const char* का उपयोग करें। तय करें कि प्राप्तकर्ता उसकी प्रति बनाएगा या नहीं, और जीवनकाल का दस्तावेज़ बनाएँ।
FFI के पार संरचनाएँ
ऐसी POD (साधारण पुरानी डेटा) संरचनाओं का उपयोग करें जिनका लेआउट C और C++ में समान हो। वर्चुअल फ़ंक्शन, संदर्भ या std प्रकारों से बचें।
कॉलबैक
FFI के पार फ़ंक्शन पॉइंटर (या void* + फ़ंक्शन पॉइंटर) भेजें। क्लोज़र के लिए एक संदर्भ पॉइंटर दें।
extern "C" {
typedef void (*Callback)(int value, void* user_data);
void register_callback(Callback cb, void* user_data);
}लिंकेज और हेडर
extern "C" केवल लिंकेज को प्रभावित करता है, व्यवहार को नहीं। फ़ंक्शन अंदर से C++ के रूप में ही कंपाइल होता है, लेकिन बाहर से C के रूप में कॉल किया जा सकता है।
त्वरित जाँच
अन्य भाषाओं के लिए C++ फ़ंक्शन उजागर करते समय उन्हें extern "C" में क्यों रखते हैं?
पुनरावलोकन
extern "C" किसी फ़ंक्शन को C लिंकेज देता है — नाम मैंगलिंग नहीं होती और C कॉलिंग कन्वेंशन का उपयोग होता है। FFI के माध्यम से C++ को अन्य भाषाओं के लिए उजागर करने हेतु इसका उपयोग करें। क्लास को अपारदर्शी पॉइंटर के पीछे छिपाएँ, सीमा पर अपवाद पकड़ें और स्वामित्व का स्पष्ट दस्तावेज़ बनाएँ।
एआई शिक्षक के साथ C++ सीखें — निःशुल्क
अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।
- पाठ्यक्रम
- 51
- पाठ
- 203
अक्सर पूछे जाने वाले प्रश्न
क्या “Extern C और C ABI” पाठ निःशुल्क है?
हाँ — C++ Academy अध्ययन पथ के 3 तक कोई भी पाठ, जिसमें “Extern C और C ABI” भी शामिल है, यहाँ वेब पर पूरा पढ़ना निःशुल्क है। इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ इंटरैक्टिव अभ्यास भी उपलब्ध कराता है। C++ Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
“Extern C और C ABI” में मैं क्या सीखूँगा?
extern C से C++ libraries के C-compatible interfaces उपलब्ध कराएँ। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ C++ Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।
क्या C++ Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?
पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर C++ Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 1वाँ पाठ है।
“Extern C और C ABI” पाठ पूरा करने में कितना समय लगता है?
CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।
क्या मैं इस C++ Academy पाठ में कोड लिख और चला सकता हूँ?
हाँ। हर C++ Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।
इस पाठ्यक्रम के सभी पाठ
- Extern C और C ABI
- pybind11 के माध्यम से Python को C++ से बुलाना
- Rust FFI boundaries के लिए C++
- बहु-भाषीय bindings के लिए SWIG