मेरे पास एक कक्षा है जिसमें केवल स्थिर सदस्य हैं।सी पुस्तकालयों से कॉलिंग सी ++ फ़ंक्शन पॉइंटर्स
मैं "एटएक्सिट" लाइब्रेरी फ़ंक्शन का उपयोग करके बाहर निकलने के लिए अपने सदस्य फ़ंक्शंस (नीचे दिए गए कोड में VerifyClean) को पंजीकृत करना चाहता हूं।
C++ FQA कहता है कि मुझे उस फ़ंक्शन के लिए बाहरी "सी" निर्दिष्ट करना होगा जिसे मैं इस तरह से पंजीकृत करना चाहता हूं, जैसे कि निम्न उदाहरण में।
class Example
{
public:
static void Initialize();
static void DoDirtyStuff {++dirtLevel;}
static void CleanUpStuff {--dirtLevel;}
private:
static void VerifyClean();
// DOESN'T COMPILE: extern "C" static void VerifyClean();
static int dirtLevel;
}
int Example::dirtLevel;
extern "C" void Example::VerifyClean() // DO I NEED extern "C" HERE?
{
assert(dirtLevel == 0);
}
void Example::Initialize()
{
dirtLevel = 0;
atexit(&VerifyClean);
}
क्या मुझे वास्तव में बाहरी "सी" का उपयोग करना है?
क्या उत्तर बदलता है यदि मैं एक गैर पुस्तकालय समारोह (सादे सी में लागू) के साथ "atexit" को प्रतिस्थापित करता हूं?
यदि फ़ंक्शन VerifyClean सार्वजनिक थे और मैंने इसे सीधे C++ कोड से कॉल करने का निर्णय लिया, तो क्या मुझे लिंक त्रुटियां या रनटाइम क्रैश मिलेगा? मैं यह पूछता हूं क्योंकि घोषणा में बाहरी "सी" का उल्लेख नहीं है, इसलिए नियमित सी ++ कोड फ़ंक्शन कॉल को गलत तरीके से संभाल सकता है। यह मेरे एमएस विजुअल स्टूडियो 2005 सिस्टम पर ठीक काम करता है।
क्यों केवल स्थिर कार्यों के साथ एक वर्ग है ? और एफक्यूए सी ++ के बारे में जानने के लिए शायद ही कोई अच्छी जगह है। –
"FQA माना हानिकारक" – jkerian
सी ++ FQA पूछे जाने वाले प्रश्न से C++ सीखने के लिए एक और अधिक विश्वसनीय स्रोत है। –