सार्वजनिक रूप से C API के रूप में C ++ कोड को उजागर करने का क्या मतलब है और इसे करने के क्या फायदे हैं?


25

मैंने अक्सर लोगों को यह कहते सुना है कि C ++ प्रोग्रामर को अपने पुस्तकालय / उत्पाद के सार्वजनिक एपीआई को C API के रूप में उजागर करना चाहिए।

इसका क्या मतलब है और इसके क्या फायदे हैं?

जवाबों:


44

इसका मतलब यह है कि आपके पुस्तकालय का एक हिस्सा जो एक इंटरफ़ेस के रूप में सामने आया है, वह केवल भाषा के C "भाग" का उपयोग करता है, इसलिए आप कक्षाएं या समान, केवल फ़ंक्शन, POD और POD युक्त संरचनाएँ निर्यात नहीं कर रहे हैं। साथ ही, आपको C ++ नाम की मेनिंग को निष्क्रिय करना होगा, आमतौर पर कार्यों को चिह्नित करके extern "C"। एक विशिष्ट उदाहरण होगा:

extern "C" void foo(int bar);

इस तरह से अपने पुस्तकालयों को उजागर करने का बड़ा फायदा यह है कि हर प्रोग्रामिंग लैंग्वेज में सी लाइब्रेरी के साथ सीधे इंटरफेस की व्यवस्था है, लेकिन बहुत कम लोग ही सी ++ लाइब्रेरी के साथ सीधे इंटरफेस कर सकते हैं। तो इस अर्थ में, आप अपने पुस्तकालय का उपयोग करने के लिए अन्य लोगों के लिए सबसे आसान बनाने के लिए सबसे कम आम भाजक के लिए जाते हैं।

हालांकि ध्यान रखें कि यह वास्तव में केवल एक उपयोगी रणनीति है यदि आप अन्य लोगों के उपभोग के लिए पुस्तकालय का निर्माण कर रहे हैं। यदि आप C ++ का एक टुकड़ा बना रहे हैं - केवल सॉफ्टवेयर और पुस्तकालयों को केवल एक-दूसरे के साथ इंटरफेस करने की आवश्यकता है, तो आप उचित C ++ API को उजागर करने से बेहतर (IMHO) हैं ताकि आप भाषा की पूरी शक्ति का उपयोग कर सकें।


14
आपको फेंके गए अपवादों को निर्यात न करने के लिए सावधान रहना चाहिए!
जेम्स

यह बहुत अच्छा जवाब है। क्या आप मुझे extern "C"सामान का एक उदाहरण दे सकते हैं , जो मुझे नहीं मिला?
डेनियल रिबेरो

1
@DanielRibeiro: "extern C" के लिए सिर्फ google है। आपको इस तरह लिंक मिलेंगे: stackoverflow.com/questions/1041866/…
Doc Brown

1
@DanielRibeiro, बहुत ही सरल उदाहरण जोड़ा गया।
टिमो ज्यूश

1
@DanielRibeiro तकनीकी रूप से अभी भी उपयोग करना संभव है .hpp, लेकिन इस एक्सटेंशन का अर्थ "C ++ हैडर फ़ाइल" है, इसलिए यह होना चाहिए .h, जो C और C ++ दोनों के लिए उपयोग किया जाता है।
लेमिस

8

टिमो के जवाब के अलावा - कुछ प्लेटफार्मों के लिए कोई स्टैंडराइज्ड C ++ ABI नहीं है (उदाहरण के लिए विंडोज - कुछ मैक ओएस एक्स के लिनक्स को व्यापक रूप से अपनाया गया है) इसलिए यह केवल लापता सुविधा का नहीं बल्कि इस तरह के फीचर को लागू करने की असंभवता है।

उदाहरण के लिए IIRC MSVC के प्रत्येक संस्करण में अलग-अलग ABI हैं और यह डिबग या रिलीज़ बिल्ड के आधार पर परिवर्तित हो सकता है - और यह प्रकाशित नहीं होता है, इसलिए तृतीय पक्ष संकलन आमतौर पर संगत नहीं होते हैं (मैं कुछ जानकारी पढ़ता हूं कि icc का कुछ संस्करण MSVC के अनुकूल है 2005 लेकिन यह एनडीए के तहत खुलासा जानकारी हो सकती है - पायथन के रचनाकारों के लिए आवश्यक उपलब्ध नहीं है) और अपने स्वयं के एबीआई का उपयोग करें। तो व्यवहार में भाषा का माहौल न केवल संकलक संस्करण को सीमित करेगा, बल्कि झंडे भी होगा।

अंत में C ++ में बहुत अधिक संकलन-समय की विशेषताएं हैं। उदाहरण के लिए जेनरिक आमतौर पर गतिशील रूप से टाइप की गई भाषाओं आदि में मौजूद नहीं होते हैं।


2
@DanielRibeiro: C ++ ABI ( en.wikipedia.org/wiki/Application_binary_interface ) के अद्भुत नरक में आपका स्वागत है । लघु संस्करण यह है कि सी ++ घटकों को अलग-अलग संकलित करना (विभिन्न संकलक / झंडे के साथ संकलित) को चुपचाप विफल / दुर्घटनाग्रस्त होने के बजाय एक साथ काम करना बहुत कठिन है।
मैकीज पाइचोटका
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.