सी में thiscall
धारणा नहीं है। सी कॉलिंग सम्मेलन सीधे सी ++ ओ को कॉल करने की अनुमति नहीं देता है सदस्य कार्य फेंक दें।
इसके लिए, आपको अपने सी ++ ऑब्जेक्ट के चारों ओर एक रैपर एपीआई की आपूर्ति करने की आवश्यकता है, जो स्पष्ट रूप से this
पॉइंटर स्पष्ट रूप से लेता है।
उदाहरण:
// C.hpp
// uses C++ calling convention
class C {
public:
bool foo(int arg);
};
सी आवरण एपीआई:
// api.h
// uses C calling convention
#ifdef __cplusplus
extern "C" {
#endif
void* C_Create();
void C_Destroy(void* thisC);
bool C_foo(void* thisC, int arg);
#ifdef __cplusplus
}
#endif
आपका एपीआई C++ लागू किया जाएगा:
#include "api.h"
#include "C.hpp"
void* C_Create() { return new C(); }
void C_Destroy(void* thisC) {
delete static_cast<C*>(thisC);
}
bool C_foo(void* thisC, int arg) {
return static_cast<C*>(thisC)->foo(arg);
}
वहाँ वहाँ बाहर महान प्रलेखन का एक बहुत है, भी । पहला I bumped intohere पाया जा सकता है।
धन्यवाद xtofl, यहां तक कि मैं सोच रहा था कि हम आवरण कार्यों लिखने की ज़रूरत है, लेकिन मैं कुछ संदेह है: 1. हम कैसे निपटते हैं, अगर वर्ग कुछ अन्य वर्गों से विरासत में मिली है, हम के लिए रैपर की जरूरत है पैरेंट क्लास फ़ंक्शन भी। 2. या हमें उन कार्यों के लिए रैपर लिखने की आवश्यकता है जिन्हें हम केवल "सी" फ़ाइल में बुला रहे हैं .... – Priyanshu
@Priyanshu: एक दिलचस्प मोड़। सी वर्चुअल फ़ंक्शंस नहीं जानता है, लेकिन आपका एपीआई कोड करता है। इसलिए यदि 'डी' (वर्चुअल)' foo' फ़ंक्शन को ओवरराइड करेगा, तो आपको अपने एपीआई में अतिरिक्त 'D_Create' की आवश्यकता होगी। फैक्टरी पैटर्न की तरह, मैं कहूंगा। लेकिन शायद आपको अधिक ठोस जानकारी प्रदान करने की आवश्यकता है। – xtofl
धन्यवाद xtofl, बस एक और बात, आपने उपरोक्त उदाहरण दिया है .... कक्षा सी { सार्वजनिक: बूल फू (int arg); }; अगर हम है क्लास सी { सार्वजनिक की तरह कुछ: bool foo (int आर्ग, एक्स * x); निजी: एक्स * एक्स; } }; फिर हम इसके लिए रैपर कैसे लिख सकते हैं ... क्या यह संभव है :-( – Priyanshu