__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.