নির্দিষ্ট প্রস্থের পূর্ণসংখ্যার সংজ্ঞা দেওয়া আছে কিনা তা কীভাবে পরীক্ষা করবেন


25

C ++, নির্দিষ্ট প্রস্থ পূর্ণসংখ্যার হিসাবে সংজ্ঞায়িত করা হয় ঐচ্ছিক , কিন্তু আমি যদি তারা আসলে সংজ্ঞায়িত করা হয় পরীক্ষা করা বাঞ্ছনীয় উপায় খুঁজে বের করতে বলে মনে হয় করতে পারবে না।

স্থির প্রস্থের পূর্ণসংখ্যা পাওয়া যায় কিনা তা পরীক্ষা করার কোনও বহনযোগ্য উপায় কী হবে?


বৈশিষ্ট্য পরীক্ষার ম্যাক্রো বলে মনে হচ্ছে না , তবে আমি মনে করি আপনি করতে পারেন#if defined(INT8_MIN)
জেরেজেস

2
যদি স্টাড লাইব্রেরি এর জন্য কোনও বৈশিষ্ট্য পরীক্ষার ম্যাক্রো সরবরাহ না করে, তবে আপনি পরীক্ষা করতে পারেন যে আপনি যে সরঞ্জামচেনটি ব্যবহার করছেন এটি তার জন্য একটি সরবরাহ করে বা আপনাকে একটি নিজস্ব পরীক্ষা সংজ্ঞায়িত করার অনুমতি দেয় কিনা। উদাহরণস্বরূপ, সিএমকে আপনাকে একটি নির্দিষ্ট ভাষা বৈশিষ্ট্য পরীক্ষা করার জন্য একটি সংজ্ঞায়িত cppফাইল সংকলন করে এবং সংকলনটি ব্যর্থ হয় বা না এমন ম্যাক্রো সেট করে যা আপনি নির্ধারণ করতে পারেন তা নির্ভর করে।
t.niese

আপনি যদি স্বতঃস্ফূর্তিকে চটকদার করতে পছন্দ করেন তবে এটির জন্য তাদের পূর্বনির্ধারিত পরীক্ষা রয়েছে। AC_TYPE_INT8_Tইত্যাদি
শান

স্ট্যান্ডিন্টে কারওর যদি কোনও ট্যাগ স্কোর থাকে তবে আইএমও সিএসডিডিন্ট একটি প্রতিশব্দ হিসাবে মনোনীত করা উচিত ( stackoverflow.com/tags/stdint/synonyms )। আমি মনে করি না এই অস্পষ্ট জিনিসের জন্য আমাদের আলাদা সি এবং সি ++ ট্যাগের প্রয়োজন; প্রশ্নের মূল ট্যাগটি যথেষ্ট।
পিটার কর্ডেস

1
@PeterCordes এই সময়েই কাজ: stackoverflow.com/tags/stdint/synonyms
অ্যান্ড্রু Henle

উত্তর:


16

একটি নির্দিষ্ট-প্রস্থের পূর্ণসংখ্যার প্রকার সরবরাহ করা হয়েছে কিনা তা নির্ধারণ করতে, আপনি সংশ্লিষ্ট [U]INT*_MAXবা [U]INT*_MINম্যাক্রোগগুলির মধ্যে কোনওটি সংজ্ঞায়িত কিনা তা পরীক্ষা করতে পারেন ।

// may be necessary for your C++ implementation
#define __STDC_LIMIT_MACROS 
#include <cstdint>

#ifdef INT32_MAX
// int32_t must be available to get here
int32_t some32bitIntVariable;
#endif

প্রতি 7.20 পূর্ণসংখ্যার প্রকারভেদে<stdint.h> , সি 11 স্ট্যান্ডার্ডের অনুচ্ছেদ 4 (সাহসী অংশগুলি নোট করুন):

এখানে বর্ণিত প্রতিটি ধরণের জন্য যা বাস্তবায়ন সরবরাহ করে, <stdint.h>সেই typedefনামটি ঘোষণা করবে এবং সম্পর্কিত ম্যাক্রো সংজ্ঞায়িত করবে । বিপরীতে, এখানে বর্ণিত প্রতিটি ধরণের জন্য যা বাস্তবায়ন সরবরাহ করে না, <stdint.h>সেই typedefনামটি ঘোষণা করবে না এবং এটি সম্পর্কিত ম্যাক্রোগুলিকে সংজ্ঞায়িত করবে না

সি ++ এর মাধ্যমে সি প্রয়োগকরণ উত্তরাধিকার সূত্রে প্রাপ্ত <cstdint>। কিছু বিবরণ জন্য <cstdint>বনাম<stdint.h> দেখুন । আরো দেখুন কী করতে __STDC_LIMIT_MACROSএবং __STDC_CONSTANT_MACROSএর অর্থ কি? বিস্তারিত জানার জন্য __STDC_LIMIT_MACROS

সুতরাং, যদি int32_tউপলব্ধ হয়, INT32_MAXএবং INT32_MINঅবশ্যই #define'ডি। বিপরীতে, যদি int32_tনা পাওয়া যায় তবে INT32_MAXনা 'd' হতেও INT32_MINঅনুমতি দেওয়া হয় না #define

যদিও দ্রষ্টব্য, যেমন @ নিকোলবোলাস অন্য উত্তরে বলেছে , আসলে এটি যাচাই করা প্রয়োজন হতে পারে না।


[U]INT*_Cকমপক্ষে ও সর্বাধিক ম্যাক্রোগুলির পরিবর্তে পরীক্ষা করা আরও কম হবে
ফুক্লভ

1
@ ফুক্লভিভ বাদে এটি একই জিনিস নয়। যেমন উপলব্ধ INT64_Cথাকলে সংজ্ঞায়িত int64_least_tহয়, যদি int64_tপাওয়া যায় না। ডকুমেন্টেশন
অরবিট-এ হালকা হওয়া রেস

19

মোটা কথা বলছি ... তুমি না।

আপনি যে আপনি স্পষ্টভাবে নির্দিষ্ট আকারের পূর্ণসংখ্যা ধরনের তারপর যে কোনো পদ্ধতি ব্যবহার করার জন্য, প্রয়োজন প্রয়োজন তাদের নির্দিষ্ট আকারের হতে ঐ ধরনের। এটি হ'ল যদি আপনি এই আকারগুলির পূর্ণসংখ্যা না পান তবে আপনার কোডটি অ-কার্যকরী হবে। সুতরাং আপনার কেবল তাদের ব্যবহার করা উচিত; যদি কেউ এমন কোনও সংকলকটিতে আপনার কোড ব্যবহার করে যাতে প্রকারের ধরণের অভাব থাকে, তবে আপনার কোডটি সংকলন করবে না। যা ঠিক আছে, কারণ আপনার কোডটি এটি সংকলন না করে কাজ করবে না।

যদি আপনার আসলে স্থির আকারের পূর্ণসংখ্যার প্রয়োজন না হয় তবে কেবল অন্য কোনও কারণে সেগুলি চান, তবে int_least_*প্রকারগুলি ব্যবহার করুন । যদি বাস্তবায়ন আপনাকে ঠিক সেই আকার দিতে পারে, তবে least_*প্রকারগুলি সেই আকার ধারণ করবে।


4
এটা সত্য নয়। প্ল্যাটফর্মগুলির জন্য অপারেটর = / ইত্যাদি প্রয়োগ করে এমন স্টাব পাসস্ট্রুগুলি লিখেছি যা আগে uint8_t সমর্থন করে না। তবে দক্ষতা এবং ডিবাগিংয়ের উদ্দেশ্যে আপনি পাসথ্রু ব্যবহার করতে চাইবেন না যদি না এটির প্রয়োজনীয়তা না থাকে।
টিএলডাব্লু

@ টিএলডাব্লু: " আমি স্ট্রিপ পাসথ্রুগুলি লিখেছি যা অপারেটর = / ইত্যাদি প্রয়োগ করে প্ল্যাটফর্মগুলির জন্য যা uint8_t এর আগে সমর্থন করে না। " ঠিক আছে, তবে ... কেন? আপনি কোন কোডটি লিখছিলেন যা নিশ্চিত হওয়া দরকার যে বাইটটি 8 বিট (যা সম্ভবত আপনি ব্যবহার করছেন কেন uint8_t) তবে এই কোডটি কোনওভাবে এমন প্ল্যাটফর্মে চালানোর প্রয়োজন যেখানে বাইটটি 8 বিট নয় (যা ব্যবহার করার পাশাপাশি) পুরানো সি ++ বাস্তবায়ন, একমাত্র কারণ কেন uint8_tউপলব্ধ হবে না)? এটি, পিছনের সামঞ্জস্যের বাইরে, আপনার এটি করার দরকার কেন?
নিকল বোলাস

মালিকানাধীন তাই খুব বেশি বলতে পারে না। ভাগ করা কোডবেস যা অন্যান্য জিনিসগুলির মধ্যে সমর্থন করার দরকার ছিল, বরং একটি স্পর্শকাতর হার্ডওয়্যার স্ট্যাক। পূর্ববর্তী অ্যাড-হক (এবং অফ-ভাঙ্গা) পদ্ধতির চেয়ে অনেক স্পষ্ট uint8_tছিল ।
TLW

আপনার যদি একটি অ্যালগরিদম থাকে যা উদাহরণস্বরূপ 8-বিট বাইটের সাথে প্রকাশ করা হয় তবে একটি পাস্ত্র্রু এমন একটি জিনিস যা আপনি একবার লিখতে পারেন এবং পরীক্ষা করা সহজ। যেখানে প্রতিটি জায়গা ঠিক করা অ্যাড-হক এবং সাবটলি ভুল হওয়া সহজ। O(1)বনাম O(n)প্রচেষ্টা। লোকেরা যেমন ব্যবহার করে একই কারণ uint16_t। আপনি জিজ্ঞাসা করছেন "কেন uint32_t ব্যবহার করবেন না এবং নিজেই এটি নিক্ষেপ করবেন না?", যার উত্তরটি সুস্পষ্ট হওয়া উচিত।
TLW

@ টিএলডাব্লু: " লোকেদের যেমন uint16_t ব্যবহার করার একই কারণ " "এটি আমার ব্যবহারের কারণ নয় uint16_t। আমার কারণ হ'ল আমি এমন একটি ডিভাইস / ফর্ম্যাট / ইত্যাদির সাথে যোগাযোগ করছি যা আমার মেশিনের জন্য এন্ডিয়ান ব্যবহার করে বাইনারি, স্বাক্ষরবিহীন পূর্ণসংখ্যার হিসাবে সুনির্দিষ্টভাবে 16 বিট ডেটা ফর্ম্যাট করার প্রত্যাশা করছে এবং যদি আমি কোনও প্রকার পাই না তবে অবিকল এটি, তারপরে কার্যকরভাবে যোগাযোগ করা অনেক বেশি কঠিন। আমার প্রোগ্রাম (ও API গুলি যে আমি এটা দিয়ে ব্যবহার করুন) মৌলিকভাবে কাজ করতে পারেনা যে একটি মেশিন উপলব্ধ করা হয় না যে।
নিকল বোলাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.