__Declspec কি এবং কখন এটি ব্যবহার করা দরকার?


157

আমি __declspecযে কোডটি পড়ছি তার উদাহরণগুলি দেখেছি । এটা কি? এবং কখন আমার এই নির্মাণটি ব্যবহার করা দরকার?


1
আপনি অপয়া ছিল এবং Linux থেকে Windows চলে আসেন সময় অপচয় পারে কেন আপনার ডিএলএল কাজ করতে না চায় চিন্তা করার চেষ্টা পর্যন্ত আপনাকে খুঁজে আপনি যোগ করতে আছে __declspec(dllexport)আপনার লাইব্রেরি প্রতিটি ফাংশন সামনে
— SomethingSomething

উত্তর:


74

এটি সি ++ ভাষার একটি মাইক্রোসফ্ট নির্দিষ্ট এক্সটেনশন যা আপনাকে স্টোরেজ শ্রেণীর তথ্যের সাথে কোনও ধরণের বা ফাংশনকে বিশিষ্ট করতে দেয়।

নথিপত্র

__ডেস্কস্পেক (সি ++)


19
ধন্যবাদ - তবে আমি এটি কিসের জন্য ব্যবহার করব?
— স্কট জে

4
সিওএম ইন্টারফেস এবং ক্লাস ঘোষণার জন্য, উদাহরণস্বরূপ, আপনি __declspec (uuid) ব্যবহার করেন রফতানির জন্য একটি DEF ফাইল সান করে আপনি __declspec (dllexport) ইত্যাদি ব্যবহার করেন পুরো তালিকাটি বেশ দীর্ঘ।
— সেবা আলেকসেয়েভ

1
@ স্কটজে আমি ক্রমাগত এটি বৈশিষ্ট্যের জন্য ব্যবহার করি: __declspec (সম্পত্তি (get = X পুট = এক্স)) তথ্য-ধরণের সনাক্তকারী। এমএসডিএন এর কোর্সের আরও বিশদ রয়েছে। "সি # টু সি / সি ++ প্রোগ্রামার" হিসাবে এটি আনন্দের!
— মাস্টারমাস্টিক

51

ক্যানোনিকাল উদাহরণগুলি হ'ল __declspec(dllimport)এবং __declspec(dllexport)যা লিঙ্কারকে একটি ডিএলএল থেকে বা প্রতীক আমদানি ও রফতানি করতে (যথাক্রমে) নির্দেশ দেয়।

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


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

( __declspec(..)কেবলমাত্র মাইক্রোসফ্টের নির্দিষ্ট জিনিসগুলি গুটিয়ে রাখে - সামঞ্জস্যতা অর্জনের জন্য, কেউ সাধারণত এটি ম্যাক্রো দিয়ে মুড়িয়ে দেয়)


8
@ টেট্রিস, আপনি কোড থেকে জানেন না। সিদ্ধান্তটি লিঙ্কারের দ্বারা করা হয়েছে, যিনি .libমিল খুঁজে পেয়েছেন তা প্রথম বেছে নেবে যার সাথে মিলবে রফতানি প্রতীক।
— ইউরো মিশেলি

19

এটি বেশিরভাগ অংশীদারি লাইব্রেরিতে (ডিএলএল) প্রতীকগুলি রফতানি / রফতানি করার জন্য ব্যবহৃত হয়। উভয় ভিজ্যুয়াল সি ++ এবং জিসিসি সংকলক সমর্থন করে __declspec(dllimport)এবং __declspec(dllexport)। অন্যান্য ব্যবহার (কিছু মাইক্রোসফ্ট-কেবল) এমএসডিএন-তে নথিভুক্ত রয়েছে ।


12

__Declspec কীওয়ার্ডটি বর্ণনা করার জন্য আর একটি উদাহরণ :

আপনি যখন উইন্ডোজ কার্নেল ড্রাইভার লিখছেন, কখনও কখনও আপনি নিজের প্রলোগ / এপিলোগ কোড সিক্যুয়েন্সগুলি ইনলাইন এসেম্বলার কোডটি ব্যবহার করে লিখতে চান , যাতে আপনি নগ্ন বৈশিষ্ট্য সহ আপনার ফাংশনটি ঘোষণা করতে পারেন ।

__declspec( naked ) int func( formal_parameters ) {}

অথবা

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

পড়ুন দয়া করে নগ্ন (C ++) গুলির


8

মূলত, এটিই মাইক্রোসফ্ট তার সি ++ এক্সটেনশনগুলি প্রবর্তন করে যাতে তারা ভবিষ্যতে স্ট্যান্ডার্ড সি ++ এর এক্সটেনশনের সাথে বিরোধ না করে। __Declspec এর সাহায্যে আপনি কোনও ফাংশন বা শ্রেণি গুণতে পারেন; __ডেস্কস্পেকের প্রকৃতির উপর নির্ভর করে সঠিক অর্থটি পরিবর্তিত হয়। __declspec (নগ্ন), উদাহরণস্বরূপ, prolog / epilog প্রজন্মকে দমন করে (বিঘ্নিত হ্যান্ডলার, এম্বেডেবল কোড ইত্যাদির জন্য), __declspec (থ্রেড) একটি পরিবর্তনশীল থ্রেড-স্থানীয় করে তোলে ইত্যাদি।

__Declspec বৈশিষ্ট্যগুলির সম্পূর্ণ তালিকা এমএসডিএন এ উপলব্ধ এবং সংকলক সংস্করণ এবং প্ল্যাটফর্মের দ্বারা পরিবর্তিত হয়।


1
নন-মাইক্রোসফ্ট সংকলকগুলির মতো বিবেচনা করা GCC 4.2, যেগুলি তাদের পাশাপাশি বিকল্প প্রস্তাব __attribute__ ((dllexport))করে __declspec(dllexport), __declspecকেবল মাইক্রোসফ্ট-কেবল এক্সটেনশন কল করা কি ন্যায়সঙ্গত ?
— ব্যবহারকারী 2338150

0

আমি জানি এটি আট বছর কেটে গেছে তবে আমি এমআরউবিতে পাওয়া কোডের এই অংশটি ভাগ করে নিতে চেয়েছিলাম যা দেখায় যে কীভাবে __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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.