সবাই কেন স্ট্যান্ডার্ড সি প্রকারের চেয়ে টাইপফ করে?


103

আপনি কিউটি ব্যবহার করতে চাইলে আপনাকে আলিঙ্গন করতে হবে quint8, quint16এবং আরও অনেক কিছু।

আপনি যদি GLib ব্যবহার করতে চান , আপনাকে স্বাগত জানাতে হবে guint8, guint16এবং আরও অনেক কিছু।

উপর লিনাক্স আছে u32, s16তাই ঘোষণা করে।

ইউসি / ওএস সংজ্ঞা দেয় SINT32, UINT16এবং আরও।

এবং যদি আপনাকে এই জিনিসগুলির কিছু সংমিশ্রণ ব্যবহার করতে হয় তবে আপনি সমস্যার জন্য আরও ভাল প্রস্তুত হন। উপর কারণ আপনার মেশিনে u32হবে typedefউপর ঘ longএবং quint32করা হবে typedefউপর ঘ intএবং কম্পাইলার অভিযোগ করবে

সবাই কেন এটি করে, যদি থাকে <stdint.h>? এটি কি গ্রন্থাগারগুলির জন্য একধরণের traditionতিহ্য?


8
মাইক্রোকন্ট্রোলার প্রোগ্রামিংয়ে মেহরদাদ আপনার কাছে বিভিন্ন ধরণের জিনিস থাকতে পারে। এভিআর মেগা উদাহরণস্বরূপ (এবং ফলস্বরূপ বিখ্যাত আরডুইনোতে) এর 16 বিট হয় এটি একটি বাজে আশ্চর্য হতে পারে। আমার মতে, 'স্বাক্ষরযুক্ত স্বল্প' আরও টাইপিং প্রচেষ্টা দরকার effort এবং এটি <s> বাইট </ s> অক্টেটের জন্য 'স্বাক্ষরবিহীন চর' ব্যবহার করে আমাকে সর্বদা দু: খিত করে তুলেছিল। স্বাক্ষরবিহীন চরিত্র, সত্যিই?
Amomum

2
@ মেহেরদাড কথাটি হ'ল আপনি সত্যই নিশ্চিত হতে পারবেন না। ঠিক এ কারণেই stdint.hআবিষ্কার হয়েছিল।
glglgl

1
@glglgl: সমস্যাটি দেখার আরও একটি উপায় এখানে: আপনি কি ভুল প্রশ্নটি সঠিকভাবে জিজ্ঞাসা করছেন না? আপনি যদি একাধিক সিস্টেমকে টার্গেট করছেন তবে কেন প্রথমে কোডটিতে বিট সংখ্যা নির্বিচারে হার্ড-কোড করবেন? যেমন, কেন কেবল sizeof(int) * CHAR_BIT(উদাহরণস্বরূপ) বলবেন না এবং এটি ব্যবহার করবেন? যদি আপনার intপরিসীমা উপস্থাপনের জন্য এটি খুব সামান্য হয় (যেমন একটি অ্যারে সূচক), তবে আপনি অবশ্যই অবশ্যই intযাইহোক ব্যবহার করা উচিত নয় , তবে এর মতো কিছু size_t। আর int32কোনও বুদ্ধি দেখাবে কেন ? একমাত্র সময় নির্ধারিত প্রস্থটি বোঝায় যে সিস্টেমগুলির মধ্যে যোগাযোগের জন্য (উদাহরণস্বরূপ ফাইল / নেটওয়ার্ক ফর্ম্যাট) ...
ব্যবহারকারী541686

1
@ মেহরদাদ নং। কখনও কখনও আমার মান আছে (যেমন কোনও এডিসি বা যে কোনও কিছু) যা আমার সঞ্চয় করা দরকার। আমি জানি তারা 16 বিট প্রশস্ত। সুতরাং ব্যবহারের সেরা টিংটি uint16_t(বা সম্ভবত এটির fastবা leastবৈকল্পিক)। আমার বক্তব্য হচ্ছে: এই ধরণেরগুলি ব্যবহারে সুবিধাজনক এবং তাদের অস্তিত্বের কারণ রয়েছে।
glglgl

1
@ মেহরদাদ: আমি আপনাকে পরামর্শ দেব - মানক কোড উত্পন্ন করার জন্য আপনার প্রচেষ্টাটি মূল্যবান বলে মনে করে - আপনার নিজের ফাংশনাল টাইপডেফগুলি বোঝাতে হবে আমার এপিআই / আমার কোডের বাকী অংশের সাথে যোগাযোগের উপায় , এবং প্রযুক্তিগত ভিত্তিতে এগুলি সংজ্ঞায়িত করতে হবে "প্রযুক্তিগত" টাইপডেফগুলি পছন্দ করে size_tএবং / অথবা uint64_t
পিজেট্রাইল

উত্তর:


80

stdint.hএই লাইব্রেরিগুলি যখন বিকাশ করা হয়েছিল তখন ফিরে ছিল না। সুতরাং প্রতিটি গ্রন্থাগার তার নিজস্ব তৈরি typedef


4
এবং ঠিক আছে, আমি মনে করি stdint.h এর অভাব একটি ভাল কারণ, তবে কেন আজও এই টাইপিডগুলি স্টাডিন্টের চেয়ে বেশি, দীর্ঘ এবং এত বেশি এবং কেন? এটি তাদেরকে
সর্বনিম্ন

25
@ আমোম "গ্লিব কেন (যা লিনাক্সে তৈরি হয়েছিল) লিনাক্স টাইপডেফ ব্যবহার করল না?" যদিও গ্লিবের "হোম বেস" অবশ্যই লিনাক্স, এটি অবশ্যই কোনও পোর্টেবল লাইব্রেরি ডিজাইন করে। নিজস্ব প্রকারের সংজ্ঞা দেওয়া বহনযোগ্যতা নিশ্চিত করে: একটি কেবলমাত্র একটি ছোট্ট শিরোনামকে গ্রহণ করতে পারে যা লাইব্রেরির সাথে যথাযথ টার্গেট প্ল্যাটফর্মের ধরণের সাথে মেলে।
পিটার - মনিকা পুনরায়

3
@ আমোম কেন গ্লিব (এটি লিনাক্সে তৈরি হয়েছিল) ... না, তা হয়নি। সাবলীল তৈরি করা হয়েছে পথ লিনাক্স কার্নেল আগে।
andy256

5
@ andy256 "GLib" "glibc" এর জন্য সংক্ষিপ্ত নয়। এটি একটি লাইব্রেরি যা জিটিকে থেকে ব্রাঞ্চ করা হয়েছিল। এটি লিনাক্সের চেয়ে পুরোনো নয়।

2
@ andy256: গ্লিব 1998, লিনাক্স 1991 I IOW, GLib লিনাক্সের পরে তৈরি করা হয়েছিল ।
এমএসএলটাররা

40

পুরানো লাইব্রেরিগুলির জন্য, এটি প্রয়োজন কারণ প্রশ্নে শিরোনাম ( stdint.h) উপস্থিত ছিল না।

এখনও চারপাশে একটি সমস্যা রয়েছে: এই ধরণের ( uint64_tএবং অন্যান্য) স্ট্যান্ডার্ডের একটি featureচ্ছিক বৈশিষ্ট্য । সুতরাং একটি মেনে চলার বাস্তবায়ন তাদের সাথে বহন করতে পারে না - এবং এভাবে আজকাল গ্রন্থাগারগুলি সেগুলি অন্তর্ভুক্ত করতে বাধ্য করে।


14
uintN_tধরনের ঐচ্ছিক, কিন্তু uint_leastN_tএবং uint_fastN_tধরনের নয়।
কুসালানন্দ

7
@ কুসালানন্দ: দুঃখের বিষয় সেগুলি সীমিত উপযোগী।
অরবিটে হালকাতা রেস

16
অবশ্যই কারণ তারা ঐচ্ছিক যে আপনি নিশ্চিত করা হয় না সেখানে যে হয় বিট ঠিক যে সংখ্যা সঙ্গে ধরনের পূর্ণসংখ্যা। সি এখনও বিজোড় পূর্ণসংখ্যার আকারের সাথে আর্কিটেকচার সমর্থন করে।
celtschk

5
@ লাইটনেসেসেসিন অরবিত: এগুলি সীমিত উপযোগিতা কীভাবে? আমাকে অবশ্যই স্বীকার করতে হবে যে হার্ডওয়্যার ইন্টারফেস ছাড়াও, আপনার মানগুলি ফিট করার জন্য আপনাকে কেবল সর্বনিম্নের চেয়ে সঠিক সংখ্যার বিট কেন প্রয়োজন হবে তা আমি দেখতে পাচ্ছি না।
celtschk

23
@Amomum typedefs হয় "যাই হোক, একটি বাস্তবায়ন (স্বাক্ষরিত ধরনের জন্য) 8 প্রস্থ, 16, 32, বা 64 বিট, কোনো প্যাডিং বিটের সাথে ধরনের পূর্ণসংখ্যা প্রদান করে, এবং যদি আছে: বাস্তবায়ন প্রয়োজনীয়তা পূরণের ধরনের প্রয়োজনে দু'জনের পরিপূরক উপস্থাপনা, এটি সম্পর্কিত টাইপএফ নামগুলি সংজ্ঞায়িত করবে। (এন 1570, 7.20.1.1 থেকে উদ্ধৃতি "সঠিক প্রস্থের পূর্ণসংখ্যার ধরণগুলি") সুতরাং স্ট্যান্ডার্ড লাইব্রেরিতে যদি এটি না থাকে তবে তৃতীয় পক্ষের একটি লাইব্রেরি হয় না, এটি বলে মনে হয়।
এরিক এম শমিট

13

stdint.h ১৯৯৯ সাল থেকে প্রমিতকরণ করা হয়েছে the সম্ভবত অনেকগুলি অ্যাপ্লিকেশন অন্তর্নিহিত মেশিন আর্কিটেকচার থেকে আংশিক স্বাধীনতা বজায় রাখতে (কার্যকরভাবে ওরফে) প্রকারগুলি সংজ্ঞায়িত করে।

তারা বিকাশকারীদের আত্মবিশ্বাস দেয় যে তাদের অ্যাপ্লিকেশনটিতে ব্যবহৃত প্রকারগুলি আচরণের বিষয়ে তাদের প্রকল্পের নির্দিষ্ট অনুমানগুলির সাথে মেলে যা ভাষার মান বা সংকলক প্রয়োগের সাথে মেলে না।

অনুশীলনটি অবজেক্ট অরিয়েন্টেড ফ্যাডেড ডিজাইন প্যাটার্নে মিরর করা হয় এবং বিকাশকারীরা সবসময় সমস্ত আমদানিকৃত লাইব্রেরির জন্য মোড়ক ক্লাস লেখেন abused

যখন প্রশংসকেরা অনেক কম স্ট্যান্ডার্ড থাকতেন এবং মেশিন আর্কিটেকচারগুলি 16-বিট থেকে আলাদা হতে পারে, 36-বিট শব্দ দৈর্ঘ্যের মেইনফ্রেমগুলির মাধ্যমে 18-বিট এটি বিবেচনার চেয়ে অনেক বেশি। অনুশীলনটি এখন 32-বিট এআরএম এমবেডেড সিস্টেমে রূপান্তরিত বিশ্বে খুব কম প্রাসঙ্গিক। বিজোড় মেমরি মানচিত্র সহ নিম্ন-স্বল্প মাইক্রোকন্ট্রোলারদের জন্য এটি উদ্বেগ থেকে যায় ।


1
মঞ্জুর, stdint.h১৯৯৯ সাল থেকে মানক করা হয়েছে, তবে এটি কতক্ষণ ব্যবহারে পাওয়া যায়? লোকেরা তাদের মান কার্যকর করতে এবং নতুন মানক গ্রহণ করে এবং তাদের দীর্ঘস্থায়ী সময়কালে, পুরানো পদ্ধতিগুলি এখনও আবশ্যক are
সিয়ুয়ান রেন

1
সঙ্গে এক কদর্য gotcha হয় stdint.hএমনকি প্ল্যাটফর্মের যেখানে যেমন উপর যে longএবং int32_tএকই আকারের ও উপস্থাপনা আছে, কোন প্রয়োজন যে ভোটদান একটি ব্যাপার int32_t*থেকে long*নির্ভরযোগ্যভাবে একটি অ্যাক্সেস করতে পারেন যে একটি পয়েন্টার সমর্পণ করা হবে int32_t। আমি স্ট্যান্ডার্ডের লেখক বিশ্বাস করতে পারছি না যে এটি স্পষ্টতই লেআউট-সামঞ্জস্যপূর্ণ প্রকারের নামটি উরফ-সামঞ্জস্যপূর্ণ হওয়া উচিত, তবে যেহেতু তারা এ কথা বলতে বিরক্ত করেন নি জিসিসি এবং আইআইআরসি ক্ল্যাংয়ের লেখকরা মনে করেন যে এমনকি এলিয়াসিং উপেক্ষা করে ভাষার উন্নতি হবে think যে ক্ষেত্রে এটি সুস্পষ্ট।
সুপারক্যাট

2
@ সুপেরাক্যাট - এটি সম্ভবত সি কমিটির কাছে এরেটাম হিসাবে জমা দেওয়ার মতো ... কারণ এটি বিনীতভাবে বোবা , এটিকে হালকাভাবে রাখতে
এলথোড

@ এলটিহোড: সিসি কমিটির স্বীকৃতি দেওয়ার জন্য যে ভুল হিসাবে এটি আঞ্চলিকভাবে ঝনঝন এবং জিসিসির আচরণকে অবহেলা হিসাবে ঘোষণা করতে হবে। আপনি কি মনে করেন যে এটি ঘটতে চলেছে? (এবং আইএমএইচও-র এগিয়ে যাওয়ার লজিক্যাল উপায়টি) আশা করা যায় এমন সেরাটি হ'ল প্রোগ্রামগুলি "এলিয়াসিং মোডগুলি" নির্দিষ্ট করার উপায়গুলি নির্ধারণ করে। যদি কোনও প্রোগ্রাম বলে যে এটি উল্লেখ করে যে এটি খুব কড়া আলিয়াজিং বিধি গ্রহণ করতে পারে, তবে একটি সংকলক বর্তমানে এটি সম্ভব তার থেকেও অনুকূলিতকরণের জন্য এটি ব্যবহার করতে পারে। যদি কোনও প্রোগ্রাম নির্দিষ্ট করে দেয় যে এর জন্য এমন বিধিগুলির প্রয়োজন যা বর্তমানের চেয়ে কিছুটা বেশি প্রোগ্রামার বান্ধব ...
সুপারক্যাট

... তবে তবুও অনেকগুলি দরকারী অপ্টিমাইজেশনের অনুমতি দেবে, তারপরে একটি সংকলক কোড তৈরি করতে পারে -fno-strict-aliasযা সম্ভব হওয়ার চেয়ে অনেক বেশি কার্যকর ছিল , তবে এটি এখনও কার্যকর হবে। যদিও বিদ্যমান কোড বেস না থাকলেও কোনও একক নিয়মই সমস্ত অ্যাপ্লিকেশনগুলির জন্য অনুকূলকরণ এবং শব্দার্থতত্ত্বের সর্বোত্তম ভারসাম্যকে আঘাত করতে পারে না, কারণ বিভিন্ন অ্যাপ্লিকেশনগুলির বিভিন্ন প্রয়োজন রয়েছে। বিদ্যমান কোডবেসে যুক্ত করুন এবং বিভিন্ন মোডের প্রয়োজনীয়তা পরিষ্কার হওয়া উচিত।
সুপারক্যাট

3

সুতরাং আপনার কাছে টাইপডেফ টাইপ করার ক্ষমতা আছে।

একটি "কোডিং হরর" উল্লেখ করেছে যে একটি সংস্থার শিরোনামে একটি পয়েন্ট ছিল যেখানে একজন প্রোগ্রামার একটি বুলিয়ান মান চায় এবং একটি গৃহস্থালি এই কাজের জন্য যৌক্তিক নেটিভ টাইপ ছিল, এবং তাই লিখেছিল typedef bool char। তারপরে কেউ একজন পূর্ণসংখ্যার সর্বাধিক যৌক্তিক পছন্দ হিসাবে খুঁজে পেয়েছিল এবং লিখেছিল typedef bool int। ফল, ইউনিকোডের আগের যুগগুলি কার্যত ছিল typedef char int

বেশ এগিয়ে, চিন্তা সামনের সামঞ্জস্য, আমি মনে করি।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.