কম্পিউটার টিউটোরিয়াল

সি++-এ অ্যাট্রিবিউটস


অ্যাট্রিবিউটস হল সি++-এ আধুনিক পদ্ধতি যা কোডটি যদি বিভিন্ন কম্পাইলারে চলে তবে সেগুলো стандар্টাইজ করার জন্য। অ্যাট্রিবিউটস কিছু অতিরিক্ত তথ্য প্রদান করতে ব্যবহৃত হয় যা শর্তাবলী (কনস্ট্রেইন্টস), অপ্টিমাইজেশন এবং প্রয়োজন হলে নির্দিষ্ট কোড জেনারেশন এনফোর্স করতে ব্যবহৃত হয়।

এই কম্পাইলারদের জন্য একটি তথ্য ম্যানুয়ালের মতো যাতে কিছু এনফোর্স করতে পারে যা কোডের পারফরমেন্স উন্নত করবে। অ্যাট্রিবিউটস প্রথম बार সি++ 11-এ দেখা গিয়েছিল এবং তখন থেকে প্রোগ্রামিং ভাষার গুরুত্বপূর্ণ অংশ, בנוסף প্রতিটি ভার্সনে কিছু রিভিশন হয় যাতে সেগুলো আরও শক্তিশালী এবং ভালো হয়।

সি++-এ অ্যাট্রিবিউটস কিভাবে ডিফাইন করবেন তা দেখি

সি++-এর বিভিন্ন ভার্সনের জন্য, অ্যাট্রিবিউটস ডিফাইন করার সিনট্যাক্স ভিন্ন।

সি++ 11-এ অ্যাট্রিবিউট তৈরি করার সিনট্যাক্স -

[[attribute-list]]

সি++ 17-এ অ্যাট্রিবিউট তৈরি করার সিনট্যাক্স -

[[using attribute-namespace : attribute_list]]

সি++ 20-এ অ্যাট্রিবিউট তৈরি করার সিনট্যাক্স (শীঘ্রই প্রকাশিত হবে) -

[[contract-attriubute-token contract-level-identifier : expression]]

আপনি ভেরিয়েবল, ফাংশন, ক্লাস সহ অনেক অ্যাট্রিবিউট ব্যবহার করতে পারেন।

এখন, যেহেতু আমরা জানি অ্যাট্রিবিউট কী, সেগুলো কীভাবে কাজ করে, এবং সেগুলো কীভাবে ডিফাইন করা হয়। চলুন সি++-এ উপলব্ধ বিভিন্ন স্ট্যান্ডার্ড অ্যাট্রিবিউটগুলো দেখি।

সি++ 11-এ পরিচিত অ্যাট্রিবিউটস

noreturn - এই অ্যাট্রিবিউটটি কম্পাইলারকে জানাতে ব্যবহৃত হয় যে ফাংশনটি কোনো মান রিটার্ন করে না।

সিনট্যাক্স

[[noreturn]] 

উদাহরণ

[[noreturn]] void f();

এই ফাংশনটি কোনো মান রিটার্ন করবে না, void-ও না।

noreturn অ্যাট্রিবিউটটি, সি++-এ ব্যবহার করা হলে, কম্পাইলারকে সক্ষম করে সতর্কতা দিতে যদি কিছু ভুল হয় এবং ফ্লো কলিং কোডে ফিরে না যায়, যেমন অনন্ত লুপ বা যেকোনো ত্রুটির ক্ষেত্রে।

carries_dependency - এটি রিলিজ-কনসিউম-এ থাকা সব নির্ভরতা ডিফাইন করতে ব্যবহৃত হয় এবং কম্পাইলারকে অপ্টিমাইজ করতে দেয় অপ্রয়োজনীয় মেমরি-খাওয়া ইনস্ট্রাকশন এড়িয়ে যাওয়া দিয়ে।

সিনট্যাক্স

[[carries_dependency]]

এটি মূলত ফাংশন বা প্যারামিটার ঘোষণার সাথে ব্যবহার করা হয় নির্ভরতা ঘোষণা করার জন্য।

deprecated - এটি কোডে একটি ডিপ্রিকেটেড এন্টিটি ডিফাইন করতে ব্যবহৃত হয়। এই ডিপ্রিকেটেড এন্টিটির ব্যবহার অনুমোদিত কিন্তু এটি ব্যবহার করার পরামর্শ দেওয়া হয় না।

সিনট্যাক্স

[[deprecated]] [[deprecated (reason)]]

reason হল একটি স্ট্রিং যা ডিপ্রিকেশন কেন করা হয়েছে তার কারণ দেয় এবং ডিপ্রিকেটেড এন্টিটির একটি বিকল্প প্রদান করে।

যে এন্টিটিগুলো ডিপ্রিকেট করা যেতে পারে সেগুলো হল ক্লাস, স্ট্রাকচার, ইউনিয়ন, typedef-name, স্ট্যাটিক মেম্বার, ফাংশন, নেমস্পেস, এনুমারেশন।

fallthrough - এটি কম্পাইলারকে ইঙ্গিত দিতে ব্যবহৃত হয় যে পরবর্তী কেসে fallthrough ইচ্ছাকৃত, এর কারণে কম্পাইলার fallthrough-র জন্য সতর্ক করে না।

সিনট্যাক্স

[[fallthrough]]

fallthrough শুধুমাত্র switch-এর সাথে ব্যবহার করা যেতে পারে কারণ এর জন্য পরবর্তী কেস ডিফাইন করা থাকে।

nodiscard - এটি একটি ফাংশনের জন্য ব্যবহৃত হয় যা একটি এনুমারেশন রিটার্ন করবে ডিসকার্ডেড ভ্যালু এক্সপ্রেশন থেকে cast to void কলের পরিবর্তে। কম্পাইলারও এর জন্য সতর্কতা জারি করবে।

সিনট্যাক্স

[[nodiscard]] [[nodiscard (reason)]] (সি++ 20-এ যোগ করা হয়েছে)

reason হল একটি স্ট্রিং যা ফলাফল বাদ না দেওয়ার কারণ প্রদান করতে ব্যবহৃত হয় এবং এটি সি++ 20-এ অন্তর্ভুক্ত হবে।

maybe_unused - এটি কম্পাইলারকে বলতে ব্যবহৃত হয় যে অপ্রयुक्त এন্টিটির ক্ষেত্রে দেখানো সতর্কতা দবা বা অপসারণ করুন।

সিনট্যাক্স

[[maybe_unused]]

যে এন্টিটিগুলো maybe_unused ঘোষণা করা যেতে পারে সেগুলো হল ক্লাস, স্ট্রাকচার, ইউনিয়ন, typedef-name, স্ট্যাটিক মেম্বার, ফাংশন, ভেরিয়েবল, এনুমারেশন।

likely, unlikely - এগুলো ব্যবহার করা হয় বর্তমান এক্সিকিউশনের চেয়ে বিকল্প পথটি অধিক বা কম সম্ভাব্য কিনা ডিফাইন করতে।

সিনট্যাক্স

[[likely]] [[unlikely]]

এগুলো সাধারণত প্রোগ্রামের ফ্লো পরিবর্তনকারী এন্টিটিতে প্রয়োগ করা হয় যেমন লেবেল এবং স্টেটমেন্ট।

no_unique_address - এটি একটি ডেটা-মেম্বার ডিফাইন করতে ব্যবহৃত হয় जिसे একটি নির্দিষ্ট ঠিকানা থাকতে হবে না। এটি সাধারণত নন-স্ট্যাটিক ডেটা মেম্বার ডিফাইন করার ক্ষেত্রে ব্যবহৃত হয় তাদের মেমরি অ্যালোকেশন প্রয়োজন নেই।

সিনট্যাক্স

[[no_unique_address]]

এটি উপযোগী যখন কম্পাইলারকে একটি সাধারণ এবং একটি no_unique_address ভেরিয়েবলের মধ্যে মেমরি লোকেশন অ্যাসাইন করতে হয় কম্পাইলার কর্তৃপক্ষ পূর্ব者কে অগ্রাধিকার দেবে।

Optimize_for_synchronized - এটি ডিফাইন করতে ব্যবহৃত হয় যে দেওয়া ফাংশনের ডেফিনিশনটি সিঙ্ক্রোনাইজড স্টেটমেন্ট থেকে ইনভোকেশন জন্য অপ্টিমাইজ করতে হবে।

সিনট্যাক্স

[[optimize_for_synchronized]]

optimize_for_synchronized হিসেবে ডিফাইন করা ফাংশনটি সিঙ্ক্রোনাইজড ব্লক সিরিয়ালাইজ এড়াবে।

expects - এটি একটি ফাংশনের আর্গুমেন্টের জন্য শর্তাবলী নির্দিষ্ট করে যেগুলো ফাংশন এক্সিকিউট হওয়ার জন্য আবশ্যক।

সিনট্যাক্স

[[expects : condition]] 

condition একটি শর্ত ডিফাইন করে যা ফাংশন এক্সিকিউট হওয়ার জন্য পূরণ করতে হবে।

এই ছিল সি++ 11 থেকে সি++ 20-এ ডিফাইন করা সকল অ্যাট্রিবিউট। এখন, দেখি কেন এই অ্যাট্রিবিউটস প্রোগ্রামিং-এ ব্যবহৃত হয় অর্থাৎ প্রস্তাবিত অ্যাট্রিবিউটস কী সমাধান করে?

  • কোডে কনস্ট্রেইন্টস যোগ করতে - অনেক ক্ষেত্রে, অ্যাট্রিবিউটস কোডে অর্থ যোগ করে এবং এটি আরও বৈধ করে এবং অতিরিক্ত প্রচেষ্টা কমায়।

  • কম্পাইলারকে আরও অপ্টিমাইজেশন তথ্য প্রদান করতে - fallthrough, likely, maybe_used এর মতো কিছু অ্যাট্রিবিউট কম্পাইলারকে নির্দিষ্ট অপ্টিমাইজেশন করার তথ্য প্রদান করে।

  • সতর্কতা এবং ত্রুটি এড়াতে - কখনও কখনও প্রোগ্রামারর লজিক সি++-এর কঠোর নিয়মের বিপরীত যায়। এটিই वो ক্ষেত্র যেখানে কিছু অ্যাট্রিবিউট আসে এবং ব্যবহারকারীদের সতর্কতা এড়াতে বা দবাতে সাহায্য করে।


  1. C++-এ আইডেন্টিফায়ার (Identifiers)

  2. লিনাক্সে C++-এর জন্য সেরা IDE কী?

  3. C#-তে অ্যাট্রিবিউট (Attribute) গুলো কী?

  4. C#-এ Obsolete অ্যাট্রিবিউট (Obsolete Attributes) কী