সাইজ_টি এবং স্ট্যান্ড :: সাইজ_টি এর মধ্যে পার্থক্য


139

এগুলি যেখানে ঘোষিত হয় সেগুলির মধ্যে size_tএবং সেগুলির ক্ষেত্রে কী পার্থক্য রয়েছে std::size_t, কখন সেগুলি ব্যবহার করা উচিত এবং অন্য কোনও ভিন্ন বৈশিষ্ট্য রয়েছে?


আমি জানতে আগ্রহী যে সি ++ স্পেস স্ট্যান্ড :: মাপ_টি সি আকার_টি টাইপের সাথে যুক্ত করে।
ডগ টি।

অনুরূপ প্রশ্নটি দেখুন: লিঙ্ক
মানকারসে

উত্তর:


88

সি size_tএবং সি ++ std::size_tএর উভয়ই একই।

সি-তে, এটি <stddef.h>এবং সি ++ এ সংজ্ঞায়িত হয়েছে, এর সংজ্ঞা দেওয়া হয়েছে <cstddef>যার বিষয়বস্তু সি শিরোনামের সমান (নীচের উদ্ধৃতিটি দেখুন)। তার হিসাবে সংজ্ঞায়িত করা স্বাক্ষরবিহীন পূর্ণসংখ্যা টাইপ এর ফলাফলের এর যাও sizeof অপারেটর।

সি স্ট্যান্ডার্ড §17.7 / 2 এ বলেছে,

size_t যা স্বাক্ষরবিহীন পূর্ণসংখ্যা টাইপ এর ফলাফলের এর যাও sizeof অপারেটর

এবং সি ++ স্ট্যান্ডার্ড cstddefhead18.1 / 3 এ ( শিরোনাম সম্পর্কে ) বলেছে,

নিম্নলিখিত পরিবর্তনগুলির সাথে বিষয়বস্তুগুলি স্ট্যান্ডার্ড সি লাইব্রেরির শিরোনামের মতো ।

হ্যাঁ, উভয়ই একই; পার্থক্যটি হ'ল সি ++ নামস্থলে সংজ্ঞায়িত size_tকরে std

দয়া করে লক্ষ্য করুন যে উপরের লাইনটি "নিম্নলিখিত পরিবর্তনগুলির সাথে "ও উল্লেখ করেছে যা উল্লেখ করা হচ্ছে না size_t। এটি বরং ভাষাতে সি ++ দ্বারা তৈরি নতুন সংযোজনগুলি (বেশিরভাগ ক্ষেত্রে) উল্লেখ করা হয় (সি তে উপস্থিত নেই) যা একই শিরোনামেও সংজ্ঞায়িত হয়েছে।


আকার_t এর পরিসীমা এবং স্টোরেজ আকার সম্পর্কে উইকিপিডিয়ায় খুব ভাল তথ্য রয়েছে

আকার_t এর পরিসীমা এবং স্টোরেজ আকার

প্রকৃত size_t প্রকার প্ল্যাটফর্ম-নির্ভরশীল ; একটি সাধারণ ভুল হ'ল সাইজ_টি হ'ল স্বাক্ষরযুক্ত ইন্টের সমান, যা প্রোগ্রামিং ত্রুটির কারণ হতে পারে, [৩] [৪] উদাহরণস্বরূপ 32২ থেকে 64৪-বিট আর্কিটেকচারে যাওয়ার সময়।

1999 এর আইএসও সি স্ট্যান্ডার্ড (সি 99) অনুসারে, সাইজ_টি কমপক্ষে 16 বিটের একটি স্বাক্ষরযুক্ত পূর্ণসংখ্যার ধরণের।

এবং বাকী আপনি উইকিপিডিয়াতে এই পৃষ্ঠাটি থেকে পড়তে পারেন ।


থ্যাটগুলি অন্য একটি প্রশ্নে নিয়ে আসে, যদি এসটিএল ইতিমধ্যে সি (সিএসডিডিডিফ) এর মাধ্যমে সাইজ_টি আমদানি করে তবে এর নিজস্ব সংস্করণ আবার কেন আছে?
অলোক সেভ করুন

43
@Als: স্ট্রিক্টলি ভাষী, এটা বলতে কোন ত্রুটি size_tথাকলে using namespace std;বা using std::size_t;। তবে, বেশিরভাগ সংকলক এটি এটিকে অনুমতি দেয় এবং স্ট্যান্ডার্ড তাদের বিশেষভাবে এটির অনুমতি দেয় (.5D.5 / 3)।
পোটোটোওয়টার

9
@ পোটাটোসওয়টার: অবশ্যই এটি কোনও ত্রুটি এবং বিশেষত স্ট্যান্ডার্ডে অনুমোদিত হতে পারে না? যদি এটি স্ট্যান্ডার্ডে থাকে তবে এটি ত্রুটি নয়!
বেন হাইমার

8
@ বেনহায়মার্স মানক শিরোনামগুলি স্ট্যান্ডার্ডগুলি কী ঘোষণা করে তা নির্ধারণ করে এবং তাদের অন্য কোনও অনাবদ্ধ নাম ঘোষণা করার অনুমতি নেই। শিরোনামটি <cstddef>ঘোষণা করতে পারে বা নাও পারে ::size_t, সুতরাং আপনি এটির উপস্থিতি বা অনুপস্থিত থাকার উপর নির্ভর করতে পারবেন না, যদি <stddef.h>না সি লাইব্রেরির বিশেষভাবে অন্তর্ভুক্ত থাকে বা এটির গ্যারান্টিযুক্ত অন্য কোন শিরোনাম না থাকে।
30-30

4
@ পোটাটোসওয়াতর: আহা, আমি এখন দেখছি আপনি কী বোঝাতে চেয়েছেন! আমি অবশ্যই এক বাক্যে অনেকগুলি "অনুমতি" দিয়ে বিভ্রান্ত হয়ে পড়েছি। আমি এখনও আপনার প্রথম মন্তব্যটি খুব দৃ is় বলে মনে করি; যেমনটি আপনি বলেছেন, ::size_tযেমন উপস্থিত রয়েছে <stddef.h>, সুতরাং আপনার সর্বদা এটির সাথে যোগ্যতা অর্জনের প্রয়োজন হবে না std::
বেন হাইমার

16

সি ++ থেকে "" 17.4.3.1.4 প্রকার ":

স্ট্যান্ডার্ড সি লাইব্রেরি থেকে প্রতিটি প্রকার টির জন্য (পাদটীকা 169), প্রকারসমূহ: টি এবং স্ট্যান্ড :: টি প্রকরণ প্রয়োগের জন্য সংরক্ষিত এবং যখন সংজ্ঞায়িত করা হয়: :: টি স্টাড :: টির মতো হবে।

এবং পাদটীকা 169:

এই প্রকারগুলি হ'ল ক্লক_টি, ডিভ_টি, ফাইল, এফপোস_টি, এলকনভ, এলডিভ_টি, এমবিস্টেট_টি, পিটিআরডিফ_টি, সিগ_অ্যাটমিক_টি, সাইজ_টি, টাইম_টি, টিএম, ভিএলিস্ট, উইকট্রান্স_টি, ডাব্লু টাইপ_টি এবং উইন্ট_টি।


সুতরাং বহনযোগ্য কোড std::Tসংজ্ঞায়িত রূপগুলি উপর নির্ভর করা উচিত নয় ?
মনকারসে

5
@ মনকারসে: আপনি যদি কেবলমাত্র সংশ্লিষ্ট শিরোনামের সি সংস্করণ অন্তর্ভুক্ত করেন তবে তাদের সংজ্ঞায়িত হওয়ার উপর নির্ভর করা উচিত নয় । আপনি #include <stddef.h>তারপর std::size_tহয়তো বা উপলব্ধ নাও হতে পারে। আপনি #include <cstddef>তারপর std::size_tপাওয়া যাচ্ছে, কিন্তু size_tশক্তি না।
ডেনিস জিকিফুজ

4
@ মনকারসে: অপোসাইট। শিরোনামগুলির সি ++ সংস্করণগুলিকে অবশ্যই std::এটিকে সংজ্ঞায়িত করতে হবে এবং অনুচ্ছেদে বলেছে এটি এটি শীর্ষ-স্তরের নেমস্পেসেও তাদের সংজ্ঞায়িত করতে পারে এবং যদি এটি হয় তবে এটি অবশ্যই তাদের std::শীর্ষ এবং স্তরের স্তরে সংজ্ঞায়িত করতে হবে । বেশিরভাগ সংকলকগুলিতে কেবল সি শিরোনাম অন্তর্ভুক্ত থাকে এবং নামগুলি আমদানি করা হয় std::, সুতরাং চিহ্নগুলি উভয়টিতেই সংজ্ঞায়িত হয়।
জান হুডেক

4
ব্যক্তিগতভাবে, আমি কখনই <সিএক্সএক্সএক্সএক্সএক্সএক্স> শিরোনাম বা std::সি তীরে থেকে আগত আইডেন্টিফায়ারগুলির রূপগুলি নিয়ে বিরক্ত করি না । আমি <xxxxx.h>স্ট্যান্ডার্ড সি হেডারগুলির সাথে লেগে আছি - এটি কখনও সমস্যা হয়নি। তাই, আমি ব্যবহার করতে চাই <stddef.h>এবং size_tদিতে না করার জন্য একটি দ্বিতীয় চিন্তার std::size_t; আসলে, এটি আমার মনকে কখনই অতিক্রম করে না যে আছে (বা হতে পারে) এ std::size_t
মাইকেল বুড়

12

এসটিডি :: size_t আসলে stddef.h এর size_t

cstddef নিম্নলিখিত দেয়:

#include <stddef.h>
namespace std 
{
  using ::ptrdiff_t;
  using ::size_t;
}

... কার্যকরভাবে পূর্ববর্তী সংজ্ঞাটি স্ট্যান্ড নেমস্পেসে আনছে।


নওয়াজ যেমন উল্লেখ করেছেন, এটি আসলে অন্যভাবে। আপনি অন্তর্ভুক্ত করতে <cstddef>এবং পেতে আশা করতে পারবেন না ::size_t, তবে আপনি অন্তর্ভুক্ত থাকলে <stddef.h>আপনি পাবেন std::size_t
এমসাল্টারস

4
@ এসএমএলটারস, আমি অনুসরণ করি না সহ <stddef.h>আপনি কেবল পাবেন ::size_t
হাইফায়ার

2
এটি তখন আপনার বাস্তবায়নে একটি বাগ।
এমসাল্টারস

4
@ এসএমএলটাররা, আমি বেশিরভাগ অনুসরণ করি না। এটি অন্যভাবে রাউন্ড হওয়া উচিত নয়? <cstddef> সি ++ থেকে আসে, সুতরাং স্টাডে স্ট্যান্ড সংজ্ঞা দেওয়া উচিত :: *? অন্যদিকে, stddef.h এর মতো একটি সি শিরোনামে, আমি কেবল সি টাইপটি আশা করব, যেমন :: আকার_t।
Ela782

11
@ এসএমএলটাররা, যেহেতু সি ++ 11 এটি সঠিক নয়। আপনি যদি অন্তর্ভুক্ত করেন <cstddef>তবে আপনাকে পাওয়ার নিশ্চয়তা এবং আপনিও পেতে std::size_tপারেন ::size_t(তবে এটির নিশ্চয়তা নেই)। যদি আপনি অন্তর্ভুক্ত করেন <stddef.h>তবে আপনাকে পাওয়ার নিশ্চয়তা রয়েছে ::size_tএবং আপনিও পেতে পারেন std::size_t(তবে এটির নিশ্চয়তা নেই)। এটি সি ++ 03 তে আলাদা ছিল তবে এটি কার্যকরভাবে অ-বাস্তবায়নযোগ্য এবং ত্রুটি হিসাবে স্থির ছিল।
জোনাথন Wakely
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.