__Declspec क्या है और मुझे इसका उपयोग कब करना है?


157

मैंने __declspecउस कोड के उदाहरण देखे हैं जो मैं पढ़ रहा हूं। यह क्या है? और मुझे इस निर्माण का उपयोग कब करना होगा?


1
यदि आप बदकिस्मत थे और लिनक्स से विंडोज के लिए चले गए हैं, तो आप समय बर्बाद हो सकता है क्यों अपने DLLs काम नहीं होगा पता लगाने की कोशिश, जब तक आप पाते हैं कि आप जोड़ने के लिए है कि __declspec(dllexport)आपकी लायब्रेरी में प्रत्येक कार्य से पहले
SomethingSomething

जवाबों:


74

यह C ++ भाषा का एक Microsoft विशिष्ट एक्सटेंशन है जो आपको भंडारण वर्ग की जानकारी के साथ एक प्रकार या फ़ंक्शन को विशेषता देता है।

प्रलेखन

__declspec (C ++)


19
धन्यवाद - लेकिन मैं इसके लिए क्या उपयोग करूंगा?
स्कॉट जे

4
COM इंटरफेस और कक्षाएं घोषित करने के लिए, उदाहरण के लिए, आप __declspec (uuid) का उपयोग करते हैं, निर्यात कार्यों के लिए एक DEF फ़ाइल जिसे आप __declspec (dllexport), आदि का उपयोग करते हैं, पूरी सूची काफी लंबी है।
सेवा अलेक्सेयेव

1
@ ScottJ मैं लगातार गुणों के लिए इसका उपयोग करता हूं: __declspec (संपत्ति (प्राप्त = एक्स पुट = एक्स)) डेटा-प्रकार पहचानकर्ता। MSDN में पाठ्यक्रम का अधिक विवरण है। "C # से C / C ++ प्रोग्रामर" के रूप में यह एक आनंद है!
मास्टरमैटिक

51

विहित उदाहरण हैं __declspec(dllimport)और __declspec(dllexport), जो लिंकर को आयात करने और निर्यात करने का निर्देश देते हैं (क्रमशः) एक DLL से या एक प्रतीक।

// header
__declspec(dllimport) void foo();


// code - this calls foo() somewhere in a DLL
foo();

( __declspec(..)बस माइक्रोसॉफ्ट के विशिष्ट सामान को लपेटता है - संगतता प्राप्त करने के लिए, एक आम तौर पर इसे मैक्रोज़ के साथ लपेट देगा)


8
@tetris, आप कोड से नहीं जानते हैं। निर्णय लिंकर द्वारा किया जाता है, जो पहले .libयह पता लगाएगा कि एक मिलान निर्यात प्रतीक है।
यूरो माइकेल

19

यह ज्यादातर एक साझा पुस्तकालय (DLL) के प्रतीकों / निर्यात प्रतीकों से आयात करने के लिए उपयोग किया जाता है। विजुअल C ++ और GCC दोनों कंपाइलर सपोर्ट करते हैं __declspec(dllimport)और __declspec(dllexport)। अन्य उपयोग (कुछ Microsoft- केवल) MSDN में प्रलेखित हैं ।


12

__Declspec कीवर्ड का उदाहरण देने के लिए एक और उदाहरण :

जब आप विंडोज कर्नेल ड्राइवर लिख रहे हैं, तो कभी-कभी आप इनलाइन असेंबलर कोड का उपयोग करके अपने स्वयं के प्रोलॉग / एपिलॉग कोड अनुक्रम लिखना चाहते हैं , ताकि आप अपने फ़ंक्शन को नग्न विशेषता के साथ घोषित कर सकें ।

__declspec( naked ) int func( formal_parameters ) {}

या

#define Naked __declspec( naked )
Naked int func( formal_parameters ) {}

कृपया नग्न (C ++) देखें


8

अनिवार्य रूप से, यह वह तरीका है जिससे Microsoft अपने C ++ एक्सटेंशन का परिचय देता है ताकि वे मानक C ++ के भविष्य के एक्सटेंशन के साथ संघर्ष न करें। __Declspec के साथ, आप एक फ़ंक्शन या क्लास को विशेषता दे सकते हैं; सटीक अर्थ __declspec की प्रकृति के आधार पर भिन्न होता है। __declspec (नग्न), उदाहरण के लिए, प्रोलॉग / एपिलॉग जनरेशन को दबाता है (इंटरप्ट हैंडलर, एम्बेड करने योग्य कोड आदि के लिए), __declspec (थ्रेड) एक वैरिएबल थ्रेड-लोकल बनाता है, और इसी तरह।

__Declspec विशेषताओं की पूरी सूची MSDN पर उपलब्ध है, और संकलक संस्करण और प्लेटफ़ॉर्म द्वारा भिन्न होती है।


1
ध्यान में रखते हुए की तरह गैर- Microsoft compilers GCC 4.2उनके लिए, इसके अलावा में है कि प्रस्ताव विकल्प __attribute__ ((dllexport))के लिए __declspec(dllexport), यह उचित कॉल करने के लिए है __declspec, एक माइक्रोसॉफ्ट केवल विस्तार?
user2338150

0

मुझे पता है कि यह आठ साल हो गया है, लेकिन मैं MRuby में पाए गए कोड के इस टुकड़े को साझा करना चाहता था जो दिखाता है कि __declspec()मधुमक्खी का उपयोग उसी स्तर पर कैसे किया जा सकता है export keyword

/** Declare a public MRuby API function. */
#if defined(MRB_BUILD_AS_DLL)
#if defined(MRB_CORE) || defined(MRB_LIB)
# define MRB_API __declspec(dllexport)
#else
# define MRB_API __declspec(dllimport)
#endif
#else
# define MRB_API extern
#endif
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.