একটি ব্যবহার করবেন না union
!
সি ++ union
এর মাধ্যমে টাইপ পাঞ্জিংয়ের অনুমতি দেয় না !
কোনও ইউনিয়ন ক্ষেত্র থেকে পড়া যা লিখিত ছিল সর্বশেষ ক্ষেত্র নয় এটি অপরিজ্ঞাত আচরণ !
অনেক সংকলক একটি এক্সটেনশান হিসাবে এটি সমর্থন, কিন্তু ভাষা কোন গ্যারান্টি দেয়।
আরও তথ্যের জন্য এই উত্তর দেখুন:
https://stackoverflow.com/a/11996970
কেবল দুটি বৈধ উত্তর রয়েছে যা পোর্টেবল হওয়ার গ্যারান্টিযুক্ত।
প্রথম উত্তর, আপনি একটি সিস্টেমে অ্যাক্সেস আছে যদি যে সমর্থন সি ++ 20,
ব্যবহার করা std::endian
থেকে <type_traits>
হেডার।
(লেখার সময়, সি ++ 20 এখনও প্রকাশিত হয়নি, তবে কিছু প্রভাবিত হওয়ার আগ পর্যন্ত std::endian
অন্তর্ভুক্তিকে সি ++ 20 এর পরে সংকলনের সময় এন্ডিয়েন্সিটি পরীক্ষা করার এটি পছন্দনীয় উপায় হবে))
সি ++ 20 এর পরে
constexpr bool is_little_endian = (std::endian::native == std::endian::little);
সি ++ 20 এর আগে, একমাত্র বৈধ উত্তরটি হ'ল একটি পূর্ণসংখ্যা সঞ্চয় করা এবং তারপরে টাইপ পেনিংয়ের মাধ্যমে এর প্রথম বাইটটি পরীক্ষা করা।
এর ব্যবহারের মতো নয়union
, এটি সি ++ এর টাইপ সিস্টেমের দ্বারা স্পষ্টভাবে অনুমোদিত।
এটিও মনে রাখা গুরুত্বপূর্ণ যে সর্বোত্তম পোর্টেবিলিটিটির জন্য static_cast
ব্যবহার করা উচিত,
কারণ reinterpret_cast
এটি বাস্তবায়িত সংজ্ঞায়িত।
যদি কোনও প্রোগ্রাম নিম্নলিখিত ধরণের একটি ব্যতীত অন্য কোনও গ্লুভের মাধ্যমে কোনও অবজেক্টের সঞ্চিত মান অ্যাক্সেস করার চেষ্টা করে তবে আচরণটি সংজ্ঞায়িত: ... একটি char
বা unsigned char
টাইপ।
সি ++ 11 এর পরে
enum class endianness
{
little = 0,
big = 1,
};
inline endianness get_system_endianness()
{
const int value { 0x01 };
const void * address = static_cast<const void *>(&value);
const unsigned char * least_significant_address = static_cast<const unsigned char *>(address);
return (*least_significant_address == 0x01) ? endianness::little : endianness::big;
}
সি ++ 11 এর পরে (এনাম ছাড়াই)
inline bool is_system_little_endian()
{
const int value { 0x01 };
const void * address = static_cast<const void *>(&value);
const unsigned char * least_significant_address = static_cast<const unsigned char *>(address);
return (*least_significant_address == 0x01);
}
সি ++ 98 / সি ++ 03
inline bool is_system_little_endian()
{
const int value = 0x01;
const void * address = static_cast<const void *>(&value);
const unsigned char * least_significant_address = static_cast<const unsigned char *>(address);
return (*least_significant_address == 0x01);
}