আমি এই ধরণের সাথে সংজ্ঞায়িত ভেরিয়েবলগুলি দেখতে পাই তবে কোথা থেকে এসেছে তা আমি জানি না এবং এর উদ্দেশ্য কী। ইন্ট বা স্বাক্ষরবিহীন ইন্ট ব্যবহার করবেন না কেন? (অন্যান্য "অনুরূপ" ধরণের কী? শূন্য_ত ইত্যাদি))
আমি এই ধরণের সাথে সংজ্ঞায়িত ভেরিয়েবলগুলি দেখতে পাই তবে কোথা থেকে এসেছে তা আমি জানি না এবং এর উদ্দেশ্য কী। ইন্ট বা স্বাক্ষরবিহীন ইন্ট ব্যবহার করবেন না কেন? (অন্যান্য "অনুরূপ" ধরণের কী? শূন্য_ত ইত্যাদি))
উত্তর:
উইকিপিডিয়া থেকে
stdlib.hএবংstddef.hহেডার ফাইল ডাটাটাইপ নামক সংজ্ঞায়িতsize_t1 যা একটি বস্তুর আকার প্রতিনিধিত্ব করতে ব্যবহৃত হয়। আকার ধারণ করে এমন লাইব্রেরির ফাংশনগুলি তাদের প্রকারের প্রত্যাশা করে এবং আকারেরsize_tঅপারেটর এটির মূল্যায়ন করেsize_t।প্রকৃত ধরণ
size_tহ'ল প্ল্যাটফর্ম নির্ভর; একটি সাধারণ ভুল অনুমান করা হয়size_tস্বাক্ষরবিহীন int- এ, যা প্রোগ্রামিং ত্রুটি হতে পারে হিসাবে একই, 2 বিশেষ করে যেমন 64-বিট আর্কিটেকচারের আরো প্রচলিত হয়ে পড়ে।
থেকে C99 7.17.1 / 2
নিম্নলিখিত শিরোনামগুলিতে ম্যাক্রোগুলি সংজ্ঞায়িত করা হয়েছে
stddef.h<স্নিপ>
size_tযা আকারের অপারেটরের ফলাফলের স্বাক্ষরবিহীন পূর্ণসংখ্যার প্রকার
intএবং unsigned intপ্রকারগুলি 32 বিট হয়, যখন আকার_t হয় 64 বিট।
আকারের অনুসারে en.cppreferences.com এ বর্ণনাটিsize_t নিম্নলিখিত শিরোনামগুলিতে সংজ্ঞায়িত করা হয়েছে:
std::size_t
...
Defined in header <cstddef>
Defined in header <cstdio>
Defined in header <cstring>
Defined in header <ctime>
Defined in header <cwchar>
size_t আকারের অপারেটরের ফলাফলের স্বাক্ষরবিহীন পূর্ণসংখ্যার ধরণ (আইএসও C99 বিভাগ 7.17))
sizeofঅপারেটর তার প্রতীক এর আকার (বাইটে), যা একটি অভিব্যক্তি বা ধরনের আলাদা নাম হতে পারে উৎপাদ। আকারটি অপারেন্ডের ধরণ থেকে নির্ধারিত হয়। ফলাফল একটি পূর্ণসংখ্যা হয়। ফলাফলটির মান বাস্তবায়ন-ডিএনড হয় এবং এর ধরণ (স্বাক্ষরবিহীন পূর্ণসংখ্যার প্রকার) হ'ল size_t(আইএসও C99 বিভাগ 6.5.3.4))
ব্যবহারিকভাবে বলতে গেলে size_tআপনি যে বাইটগুলি সম্বোধন করতে পারবেন তার প্রতিনিধিত্ব করে। গত 10-15 বছর ধরে বেশিরভাগ আধুনিক স্থাপত্যগুলিতে 32 টি বিট হয়েছে যা স্বাক্ষরবিহীন কোনও আকারের আকারও রয়েছে। তবে আমরা bit৪ বিট uintঠিকানায় চলে যাচ্ছি যখন ইচ্ছেটি সম্ভবত 32 বাইটে থাকবে (এটির আকারটি সি ++ স্ট্যান্ডার্ডে নিশ্চিত নয়)। আপনার কোডটি তৈরি করতে যা আর্কিটেকচার জুড়ে মেমরির আকারের পোর্টেবলের উপর নির্ভর করে আপনার একটি ব্যবহার করা উচিত size_t। উদাহরণস্বরূপ অ্যারের আকারের মতো জিনিসগুলির সর্বদা ব্যবহার করা উচিত size_t। আপনি যদি স্ট্যান্ডার্ড পাত্রে দেখেন তবে ::size()সর্বদা একটি প্রদান করে size_t।
এছাড়াও নোট করুন, ভিজ্যুয়াল স্টুডিওতে একটি সংকলন বিকল্প রয়েছে যা "64-বিট পোর্টিবিলিটি সমস্যাগুলি সনাক্ত করুন" নামক এই জাতীয় ত্রুটিগুলি পরীক্ষা করতে পারে।
এই উপায়টি আপনি সর্বদা জানেন যে আকারটি কী, কারণ একটি নির্দিষ্ট ধরণ মাপের জন্য উত্সর্গীকৃত। খুব নিজস্ব প্রশ্ন দেখায় যে এটি একটি সমস্যা হতে পারে: এটি একটি intবা একটি unsigned int? এছাড়াও, মাত্রার কি ( short, int, long, ইত্যাদি)?
একটি নির্দিষ্ট ধরণের নিয়োগ করা হয়েছে বলে আপনাকে দৈর্ঘ্য বা স্বাক্ষরিত নেসটি নিয়ে চিন্তা করতে হবে না।
আসল সংজ্ঞাটি সি ++ রেফারেন্স লাইব্রেরিতে পাওয়া যাবে , যা বলে:
প্রকার:
size_t(স্বাক্ষরযুক্ত অবিচ্ছেদ্য প্রকার)শিরোলেখ:
<cstring>
size_tভাষা অপারেটর দ্বারা ফিরিয়ে দেওয়া ইন্টিগ্রাল ডেটা টাইপের সাথে মিলে যায় এবং এটিতেsizeofসংজ্ঞায়িত হয়<cstring>শিরোনামহীন ইন্টিগ্রাল টাইপ হিসাবে শিরোনাম ফাইলে (অন্যদের মধ্যে) ।ইন
<cstring>, এটা পরামিতি ধরণ হিসেবে ব্যবহার করা হয়numফাংশনmemchr,memcmp,memcpy,memmove,memset,strncat,strncmp,strncpyএবংstrxfrm, সব ক্ষেত্রেই এটা বাইট বা অক্ষরের ফাংশন প্রভাবিত হয়েছে সর্বোচ্চ সংখ্যক নির্দিষ্ট করতে ব্যবহৃত হয়।এছাড়া রিটার্ন টাইপ জন্য হিসাবে ব্যবহার করা হয়
strcspn,strlen,strspnএবংstrxfrmরিটার্ন মাপ এবং লেন্থ করতে।
আকার_t আপনার স্ট্যান্ডার্ড লাইব্রেরির শিরোনামগুলিতে সংজ্ঞায়িত করা উচিত। আমার অভিজ্ঞতা হিসাবে, এটি সাধারণত স্বাক্ষরবিহীন ইনট্রে টাইপডেফ। কথাটি যদিও এটি হ'ল না। আকার_t এর প্রকারগুলি স্ট্যান্ডার্ড গ্রন্থাগার বিক্রেতাকে প্ল্যাটফর্মের জন্য উপযুক্ত হলে তার অন্তর্নিহিত ডেটা প্রকারগুলি পরিবর্তন করার স্বাধীনতা দেয়। যদি আপনি ধরে নেন যে সাইজ_টি সর্বদা স্বাক্ষরযুক্ত না থাকে (কাস্টিং ইত্যাদির মাধ্যমে), আপনি যদি ভবিষ্যতে সমস্যার সমাধান করতে পারেন তবে আপনার বিক্রেতা যদি সাইজ_টাকে 64৪-বিট টাইপের রূপে পরিবর্তন করে। এই কারণে এই বা অন্য কোনও গ্রন্থাগারের ধরণের সম্পর্কে কিছু ধারণা নেওয়া বিপজ্জনক।
void_tগুগল অনুসন্ধানের ফলাফল ছাড়া আমি এর সাথে পরিচিত নই (এটি এটিএন্ডটি রিসার্চে কিম-ফোং ভোর একটি লাইব্রেরিতে ব্যবহৃত হয়েছে)vmalloc - আমি নিশ্চিত যে এটি অন্যান্য লাইব্রেরিতেও ব্যবহৃত হয়েছে)।
বিভিন্ন এক্সএক্সএক্সএক্স_টি টাইপডিফগুলি নির্দিষ্ট নির্দিষ্ট প্রয়োগ থেকে কোনও প্রকারের বিমূর্ত ব্যবহার করতে ব্যবহৃত হয়, যেহেতু নির্দিষ্ট জিনিসের জন্য ব্যবহৃত কংক্রিটের ধরণগুলি এক প্ল্যাটফর্ম থেকে অন্য প্ল্যাটফর্মের মধ্যে পৃথক হতে পারে। উদাহরণ স্বরূপ:
Void_tvmallocলাইব্রেরির রুটিনগুলি দ্বারা ফিরিয়ে দেওয়া পয়েন্টার প্রকারের বিমূর্ততা এনে দেয় কারণ এটি এমন সিস্টেমে কাজ করার জন্য লেখা হয়েছিল যা প্রাক-তারিখের এএনএসআই / আইএসএস সি যেখানে শব্দটির voidঅস্তিত্ব থাকতে পারে। কমপক্ষে এটাই আমি অনুমান করতাম।wchar_t বিস্তৃত অক্ষরের জন্য ব্যবহৃত টাইপটিকে বিমূর্ত করে তোলে কারণ কিছু সিস্টেমে এটি একটি 16 বিট টাইপ হবে, অন্যদের কাছে এটি 32 বিট টাইপ হবে।সুতরাং আপনি যদি wchar_tপ্রকারের পরিবর্তে প্রকারটি ব্যবহার করতে আপনার প্রশস্ত চরিত্রের হ্যান্ডলিং কোডটি লিখেন , বলুন unsigned short, এই কোডটি সম্ভবত বিভিন্ন প্ল্যাটফর্মগুলিতে আরও বহনযোগ্য হবে।
সংক্ষিপ্ত প্রোগ্রামগুলিতে যেখানে কোনও size_tসংজ্ঞায় "সুযোগক্রমে" লোড করা হয়নি তবে কিছু কিছুতে আমার এখনও এটি প্রয়োজন (উদাহরণস্বরূপ অ্যাক্সেস করার জন্য std::vector<double>), তারপরে আমি সঠিক প্রকারটি বের করতে সেই প্রসঙ্গটি ব্যবহার করি । উদাহরণ স্বরূপtypedef std::vector<double>::size_type size_t ।
( namespace {...}স্কোপটি সীমাবদ্ধ করার জন্য যদি প্রয়োজন হয় তবে চারপাশে ))
"কেন ইন্ট বা স্বাক্ষরবিহীন ইন্ট ব্যবহার করবেন না?", কেবল কারণ এটি অর্থহীনভাবে আরও অর্থবহ নয়। এর বাস্তব কারণ আছে যা বলা যায়, typedefএকটি হিসাবে intএবং তারপরে পরে উন্নীত হতে পারে long, কাউকে অবশ্যই তাদের কোড পরিবর্তন না করেই অবশ্যই করা যেতে পারে তবে মৌলিকভাবে এর চেয়ে বেশি যে কোনও ধরণের অর্থবোধক বলে মনে করা হয়। ব্যাপকতর সরলকরণের জন্য, টাইপের একটি পরিবর্তনশীল সময়ের আকার ধারণের জন্য size_tউপযুক্ত, যেমন আকারের জিনিসগুলি সমেত জন্য উপযুক্ত এবং ব্যবহার করা time_tহয়। এগুলি কীভাবে বাস্তবায়িত হয় তা কার্যকরভাবে প্রয়োগের কাজ হওয়া উচিত। কেবল সমস্ত কিছু কল করার সাথে তুলনা intকরে, এর মতো অর্থবহ টাইপনেমগুলি ব্যবহার করে আপনার প্রোগ্রামের অর্থ এবং অভিপ্রায় স্পষ্ট করতে সহায়তা করে, যেমন কোনও ধরণের সমৃদ্ধ সংখ্যক ধরণের সেট যেমন করে।