मैं वर्तमान में Windows के लिए C ++ लाइब्रेरी विकसित कर रहा हूं जिसे DLL के रूप में वितरित किया जाएगा। मेरा लक्ष्य बाइनरी इंटरऑपरेबिलिटी को अधिकतम करना है; अधिक सटीक रूप से, मेरे DLL में होने वाले कार्यों को DLVC को फिर से जोड़ने के बिना MSVC ++ और MinGW के कई संस्करणों के साथ संकलित कोड से उपयोग करने योग्य होना चाहिए। हालाँकि, मैं इस बात को लेकर उलझन में हूँ कि किस सम्मेलन को बुलाना सबसे अच्छा है, cdecl
या stdcall
।
कभी-कभी मुझे ऐसे कथन सुनाई देते हैं जैसे "सी कॉलिंग कन्वेंशन केवल एक ही एग्रॉस कंपाइलर होने की गारंटी है", जो कि " विशेष रूप से कैसे मानों को वापस करने के लिए " की व्याख्या में कुछ भिन्नताएंcdecl
जैसे बयानों के विपरीत हैं । ऐसा प्रतीत होता है कि कुछ पुस्तकालय डेवलपर्स (जैसे कि libsndfile ) को सीएल कन्वेंशन का उपयोग करने के लिए डीएलएल में सी कॉलिंग कन्वेंशन का उपयोग करना बंद कर देते हैं, वे बिना किसी दृश्य समस्याओं के।
दूसरी ओर, stdcall
कॉलिंग कन्वेंशन को अच्छी तरह से परिभाषित किया गया लगता है। मुझे जो बताया गया है, उससे सभी विंडोज कंपाइलरों को मूल रूप से इसका पालन करने की आवश्यकता है क्योंकि यह Win32 और COM के लिए उपयोग किया जाने वाला सम्मेलन है। यह इस धारणा पर आधारित है कि Win32 / COM समर्थन के बिना एक विंडोज कंपाइलर बहुत उपयोगी नहीं होगा। फ़ोरम पर पोस्ट किए गए बहुत सारे कोड स्निपेट फ़ंक्शंस घोषित करते हैं, stdcall
लेकिन मुझे एक भी पोस्ट नहीं मिल रही है जो स्पष्ट रूप से बताती है कि क्यों ।
वहाँ बहुत अधिक विरोधी जानकारी है, और मेरे द्वारा चलाए जाने वाले प्रत्येक खोज से मुझे अलग-अलग उत्तर मिलते हैं जो वास्तव में मुझे दोनों के बीच निर्णय लेने में मदद नहीं करता है। मैं एक स्पष्ट, विस्तृत, तर्कपूर्ण स्पष्टीकरण की खोज कर रहा हूं कि मुझे दूसरे पर एक का चयन क्यों करना चाहिए (या दोनों क्यों बराबर हैं)।
ध्यान दें कि यह प्रश्न न केवल "क्लासिक" फ़ंक्शन पर लागू होता है, बल्कि आभासी सदस्य फ़ंक्शन कॉल पर भी लागू होता है, क्योंकि अधिकांश क्लाइंट कोड "इंटरफेस", शुद्ध आभासी कक्षाओं (उदाहरण के लिए यहां और वहां वर्णित पैटर्न के माध्यम से) के माध्यम से मेरे DLL के साथ इंटरफ़ेस करेंगे ।