c++ - मैं प्रति-सदस्य के आधार पर एक क्लास__डीसीएलएसपीसी(डेलक्सपोर्ट) एनोटेशन स्कोप कैसे ओवरराइड कर सकता हूं?




visual-c++ dll (2)

ईएलएफ लक्ष्य पर, अगर मेरे पास class Foo और मैंने इसे class __attribute__((visibiility("default"))) Foo जैसे एक घोषणा के जरिए default दृश्यता दिया है, class __attribute__((visibiility("default"))) Foo , तब मैं चुनिंदा वर्ग के कुछ सदस्यों को class __attribute__((visibiility("default"))) Foo द्वारा default दृश्यता होने से छूट सकता हूं इन्हें स्पष्ट रूप से __attribute__((visibility("hidden")) । यह इनलाइन विधियों के लिए उपयोगी हो सकता है, जिन्हें एबीआई का हिस्सा नहीं बनाया जाना चाहिए, ताकि यदि वे class Foo को परिभाषित करते हुए लाइब्रेरी बनाने में उत्सर्जित हों, तो वे निर्यात नहीं किए जाते हैं, या class Foo भीतर private सदस्यों या प्रकारों के लिए, जो इसके एबीआई का हिस्सा नहीं बनना चाहिए

हालांकि, विंडोज़ पर, इस को प्राप्त करने का कोई मतलब नहीं प्रतीत होता है। जबकि एक अनजान class Foo स्वचालित रूप से एक DLL के लिए निजी है, जिसे एक बार class __declspec(dllexport) Foo रूप में सजाया गया है, पूरे क्लास अब dllexport , और इसमें कोई भी संबद्ध एनोटेशन नहीं है, जो किसी विशेष सदस्य के __dllexport स्थिति को चुनिंदा ओवरराइड कर सकता है। "निर्यात के लिए नहीं" सदस्यों को __declspec(dllimport) के रूप में चयन करना स्पष्ट रूप से गलत है।

कुछ क्लास सदस्यों और / या प्रकारों के लिए आवेदन करने से क्लास को __dllexport को स्कॉच करने से रोकने का कोई दूसरा तरीका है?

इस अधिक ठोस बनाने के लिए, मैं क्या कहना चाहूंगा, और कह सकता हूँ, जब ELF एनोटेशन का उपयोग करना है:

class __attribute__((visibility("default"))) Foo {
public:
    Foo(); // OK, default visibility

    // Don't let inlines join the ABI
    __attribute__((visibility("hidden")) inline void something() { ... }

private:
    // Don't let private members join the ABI
    __attribute__((visibility("hidden")) void _internal();

    // Our pImpl type is also not part of the ABI.
    struct __attribute__((visibility("hidden")) pimpl;
};

लेकिन मैं एमएसवीसी विशेषताओं का उपयोग करते हुए एक ही चीज़ नहीं बना सकता हूं:

class __declspec(dllexport) Foo {
public:
    Foo(); // OK, dllexport'ed

    // Don't let inlines join the ABI, but how to say it?
    __declspec(???) inline void something() { ... }

private:
    // Don't let private members join the ABI, but how?
    __declspec(???) void _internal();

    // Our pImpl type is also not part of the ABI, but how?
    struct __declspec(???) pimpl;
};

एक वास्तविक दुनिया के कार्यान्वयन में, मुझे उम्मीद थी कि इन दोनों के बीच भिन्नता एक मैक्रो के पीछे छिपी होगी।

क्या कुछ __declspec जो मैं देख रहा हूं जिस पर __declspec का अर्थ है __attribute__((visibility("hidden"))) और __declspec(dllexport) के क्लास स्कोप अनुप्रयोग को ओवरराइड कर सकते हैं?


मैंने ऐसा कभी नहीं किया, हालांकि एमएसडीएन दस्तावेज का पालन ​​करना संभव है।

आपको वर्ग स्तर पर कोई __declspec निर्दिष्ट नहीं करना चाहिए, और केवल उन सदस्यों के लिए __declspec(dllexport) निर्दिष्ट करें __declspec(dllexport) आप चाहते हैं।

उममीद है कि इससे मदद मिलेगी।


एमएसडीएन दस्तावेज़ीकरण एक विचार देता है कि यह कैसे किया जा सकता है। यहाँ एक नमूना है

DLL_declspec.h:

#elif defined(BUILD_DLL)
   #define DLL_DECLSPEC __declspec(dllexport)
#else
   #define DLL_DECLSPEC __declspec(dllimport)
#endif

संपूर्ण वर्ग को निर्यात करने के लिए:

#include "DLL_declspec.h"

class DLL_DECLSPEC TestExport
{
   public:

      TestExport();

      ~TestExport();

      std::string getName();

      int getID();
};

केवल वर्ग के एक हाथी सदस्य निर्यात करने के लिए:

#include "DLL_declspec.h"

class TestExport
{
   public:

      DLL_DECLSPEC TestExport();

      DLL_DECLSPEC ~TestExport();

      DLL_DECLSPEC std::string getName();

      int getID();
};




elf