मुझे मैक ओएस एक्स में रनटाइम पर लाइब्रेरी फ़ंक्शन से गतिशील रूप से लिंक करने की आवश्यकता है। Apple's example के बाद, मैं एक फ़ंक्शन पॉइंटर घोषित करता हूं और इसे dlsym() के परिणाम के साथ असाइन करता हूं। निम्न उदाहरण एक सादा सी (.c) फ़ाइल के रूप में सफलतापूर्वक संकलित करता है। लेकिन मैं एक सी ++ फ़ाइल में इस की जरूरत है, और अगर मैं एक सी ++ फ़ाइल (सीपीपी) के रूप में इस उदाहरण संकलन, बजना संकलक मुझसे कहता हैफ़ंक्शन पॉइंटर असाइनमेंट सी में काम करता है लेकिन सी ++
प्रकार का एक चर प्रारंभ नहीं कर सकता 'शून्य () (चार *)' प्रकार के एक राव्यू के साथ 'शून्य '
यह सादे 'सी' में क्यों काम करता है, और मैं इसे कैसे ठीक कर सकता हूं?
#include <dlfcn.h>
void Test() {
// Load the library which defines myFunc
void* lib_handle = dlopen("myLib.dylib", RTLD_LOCAL|RTLD_LAZY);
// The following line is an error if compiled as C++
void (*myFunc)(char*) = dlsym(lib_handle, "myFunc");
myFunc("Hello");
dlclose(lib_handle) ;
}
... या शायद 'static_cast': http://stackoverflow.com/questions/310451/should-i-use-static-cast-or-reinterpret-cast-when-casting-a-void-to- जो भी –
सी मानक I का संस्करण कहता है कि 'शून्य' के लिए एक सूचक को किसी सूचक से या _object_ प्रकार '(जोर जोड़ा गया) में परिवर्तित किया जा सकता है। एक फ़ंक्शन ऑब्जेक्ट प्रकार नहीं है, और सी ने कभी भी 'शून्य *' और पॉइंटर्स के बीच रूपांतरणों (स्पष्ट या निहित) को रूपांतरणों की अनुमति नहीं दी है। मुझे यकीन नहीं है, लेकिन मुझे लगता है कि एक निदान की आवश्यकता है। (मुझे नहीं लगता कि यह अपरिभाषित व्यवहार है।) और स्पष्ट कलाकार (यहां तक कि 'reinterpret_cast') भी काम नहीं करना चाहिए। (अधिकांश यूनिक्स कंपाइलर्स इस संबंध में अनुरूप नहीं हैं, लेकिन चूंकि यह एक एक्सटेंशन है, इसलिए प्रत्येक कंपाइलर इसे पसंद करने के लिए स्वतंत्र है।) –
@ जेम्ससांज सही है, सी के पास 'शून्य *' से कोई संकेतक नहीं है, किसी भी पॉइंटर-टू- कार्य प्रकार एक अनुरूप सी संकलक को निदान जारी करना चाहिए (जो केवल एक चेतावनी हो सकता है); एक गैर-अनुरूप सी संकलक, जैसा कि अधिकांश डिफ़ॉल्ट रूप से होते हैं, वह कुछ भी पसंद कर सकते हैं। –