c++ Std:: runtime_error से प्राप्त क्लास को कैसे डेलप्लेप करें?



windows exception (1)

मैंने मानक अपवाद से प्राप्त अपवाद वर्ग प्रदान करने वाला एक पुस्तकालय स्थापित किया है:

#include <stdexcept>
#include <string>

class BaseException : public std::runtime_error
{
    public:
        BaseException( std::string const & msg );
};

अब तक सब ठीक है. यूनिक्स पर काफी अच्छी तरह से संभालता है और संभालता है अब मैं इसे संकलित करने के लिए विंडोज डीएलएल में prepping हूँ:

#ifdef WIN32
#define MY_EXPORT __declspec(dllexport)
#else
#define MY_EXPORT
#endif

#include <stdexcept>
#include <string>

class MY_EXPORT BaseException : public std::runtime_error
{
    public:
        BaseException( std::string const & msg );
};

हालांकि, यह मुझे C4275 चेतावनी देता है: non – DLL-interface class 'std::runtime_error' used as base for DLL-interface class 'BaseException'

और दुर्भाग्यवश, मैं माइक्रोसॉफ्ट-शैली के दस्तावेजों से कुछ एलर्जी है: अत्यधिक शब्दों में, और बिंदु पर बहुत ज्यादा नहीं। यह मुझे पूरी तरह से मेरी समस्या को हल करने के लिए वास्तव में क्या उम्मीद की जाती है के रूप में उलझन में रहती है।

क्या आप में से कोई मुझे रोशन कर सकता है? मैं बस बेस क्लास को छोड़ सकता था, लेकिन फिर std::runtime_error या std::exception को पकड़ने में मेरा कस्टम अपवाद वर्ग नहीं होगा, और मुझे यह संभव होना चाहिए। इसलिए...?


इस प्रकार की स्थिति में आपके लिए कुछ विकल्प हैं

  1. इसे निर्यात करें
  2. अनदेखी करो इसे।
  3. इन-लाइन में

यह ध्यान में रखना महत्वपूर्ण है कि डीएलएल से वर्ग को निर्यात करने का "सही" तरीका पूरे वर्ग को निर्यात करना है, जिसमें कुर्सियां ​​और सदस्यों शामिल हैं इस कारण से CodeProject पर इस तरह की कई तकनीकें हैं, जो क्लास (और मिलान करने वाला नाश) बनाने के लिए एक "इंटरफ़ेस" और उपयुक्त फैक्ट्री का उपयोग करते हैं।

इस स्थिति में आपके लिए यह बहुत उपयोगी नहीं है, std::runtime_error को निर्यात करने का प्रयास संभवतः अधिक प्रयास है और बाद में भी बड़े मुद्दों को पेश करने की संभावना है।

माइक्रोसॉफ्ट कनेक्ट साइट ( वेबखिला ) से लिया गया, इन त्रुटियों का परिवार अनिवार्य रूप से शोर है;

मैं इसे पहली जगह से टालने की सलाह देता हूं - अपने डीएलएल के इंटरफ़ेस में एसटीएल प्रकार डालकर आपको एसटीएल के नियमों (विशेष रूप से, आप वीसी के विभिन्न प्रमुख संस्करणों को मिश्रित नहीं कर सकते हैं, और आपकी आईडीएल सेटिंग्स को मैच करना होगा) द्वारा खेलने के लिए मजबूर करता है। हालांकि, एक वैकल्पिक हल है C4251 अनिवार्य रूप से शोर है और चुप हो सकता है ...

स्टीफन टी। लववेज (माइक्रोसॉफ्ट की सी ++ लाइब्रेरी के रखरखाव में से एक)

इतने लंबे समय के रूप में संकलक विकल्प परियोजना के माध्यम से सुसंगत हैं, बस इस चेतावनी को शांत करना ठीक होना चाहिए।

अंतिम विकल्प BaseException क्लास इनलाइन को परिभाषित करना है और इसे बिल्कुल भी निर्यात नहीं करना है

मेरे अनुभव में, इनलाइन विकल्प लगभग अपवाद वर्गों के लिए हमेशा आसान हो गया।

वीएस2015 के लिए सी ++ रनटाइम में बदलाव, ने स्टडी std::exception के निर्यात में बदलाव किए std::exception (इसे रनटाइम से निर्यात नहीं किया गया है)।

इस समय इनलाइन विकल्प सबसे उपयुक्त लगते हैं (आपका माइलेज भिन्न हो सकता है)





dllexport