C फ्रेमवर्क के लिए कॉलबैक फ़ंक्शन के रूप में C++ सदस्य फ़ंक्शन का उपयोग कैसे करें




callback (4)

एक सी लाइब्रेरी (जो मैं बदल नहीं सकता) है जो कि कॉलबैक फ़ंक्शन के प्रकार का समर्थन करता है

void (*callback)(void *appContext, int eventid)

मैं कॉलबैक के रूप में सी ++ फ़ंक्शन सेट करना चाहता हूं।

विशेष रूप से मेरे पास निम्नलिखित प्रश्न हैं?

  1. क्या मुझे "extern C" ब्लॉक के तहत कॉलबैक फ़ंक्शन घोषित करने की आवश्यकता है?

  2. क्या सदस्य फ़ंक्शन को कॉलबैक फ़ंक्शन होने के लिए स्थिर होना चाहिए? क्या यह एक गैर-स्थिर सदस्य फ़ंक्शन का उपयोग करना संभव है? यदि हां, तो कैसे? और जब यह एक गैर-स्थिर सदस्य समारोह का उपयोग करने की सिफारिश की जाती है?

  3. क्या यह बात है कि फ़ंक्शन एक टेम्पलेट फ़ंक्शन है या नहीं?

  4. क्या किसी गैर-क्लास सी स्टाइल फंक्शन के पास क्लास सदस्य फंक्शन पर कोई लाभ है?

मैं इन प्रकारों को पुराने वीसी ++ कंपाइलर पर कोशिश कर रहा हूं, जो नवीनतम सी ++ मानक का समर्थन नहीं करता है। लेकिन कोड को प्लेटफ़ॉर्म स्वतंत्र होना चाहिए और अधिकांश C ++ compilers पर काम करना चाहिए। मैं जानना चाहता हूं कि कॉलबैक के साथ अभ्यास की क्या सिफारिश है?


  1. सुनिश्चित करें कि यह वैश्विक दायरे में है

  2. extern "C" उपयोग करें

  3. __cdecl उपयोग करें, यदि आवश्यक हो: void (_cdecl *callback)


कड़ाई से बोलते हुए, आप नहीं कर सकते एसी कॉलबैक को extern "C" नामित किया जाना चाहिए, जो सदस्य कार्यों के लिए संभव नहीं है। केवल फ्रीस्टैंडिंग फ़ंक्शन का उपयोग किया जा सकता है आप स्थिर या गैर-स्थिर सदस्य कार्यों सहित किसी भी C ++ फ़ंक्शन पर कॉल कर सकते हैं।

प्लेटफार्म पर निर्भर करते हुए, आप कभी-कभी extern "C" को छोड़कर भाग निकलने में सक्षम हो सकते हैं, लेकिन मैं अपनी किस्मत का परीक्षण नहीं करूंगा


यदि आपका सदस्य कार्य स्थैतिक है तो यह काम करना चाहिए।


यह एक extern "C" ब्लॉक के तहत कॉलबैक फ़ंक्शन को घोषित करने के रूप में सरल नहीं है आपको यह पता करने की जरूरत है कि सी लाइब्रेरी क्या कॉलिंग है, इसके कार्यों के लिए उपयोग किया जाता है।

जिन शर्तों मैं उपयोग करने जा रहा हूं, वे माइक्रोसॉफ्ट के विशिष्ट हैं, लेकिन समान नियम अन्य प्लेटफार्मों पर भी लागू होते हैं।

डिफ़ॉल्ट रूप से, दृश्य C ++ कंपाइलर सी फ़ंक्शन __stdcall और C ++ फ़ंक्शन __cdecl । आप इन कॉलिंग सम्मेलनों का मिश्रण नहीं कर सकते हैं क्योंकि इनमें से प्रत्येक स्टैक को साफ करने के बारे में अलग-अलग धारणा करता है। यहाँ एक अधिक विस्तृत स्पष्टीकरण है

एक बार जब आप कॉलिंग सम्मेलनों से मेल खाएंगे, तो सबसे आसान तरीका है कि आप अपने सी + + कॉलबैक फ़ंक्शन को एक नेमस्पेस स्कोप फ्री स्टैंडिंग फ़ंक्शन के रूप में घोषित करें; या यदि यह सदस्य फ़ंक्शन की जरूरत है, तो एक स्थिर सदस्य कार्य दोनों ही मामलों में आप std::bind का उपयोग कर वर्ग के उदाहरण के लिए एक संकेतक को std::bind । आप एक गैर-स्थिर सदस्य कार्य को बाध्य करने के लिए std::bind का उपयोग करने में सक्षम भी हो सकते हैं लेकिन मुझे अपने सिर के शीर्ष से वाक्य रचना याद नहीं है I





callback