আমি আগে ইউনিয়নগুলি স্বাচ্ছন্দ্যে ব্যবহার করেছি; আজ আমি এই পোস্টটি পড়ার সময় শঙ্কিত হয়েছি এবং এই কোডটি জানতে পেরেছিলাম
union ARGB
{
uint32_t colour;
struct componentsTag
{
uint8_t b;
uint8_t g;
uint8_t r;
uint8_t a;
} components;
} pixel;
pixel.colour = 0xff040201; // ARGB::colour is the active member from now on
// somewhere down the line, without any edit to pixel
if(pixel.components.a) // accessing the non-active member ARGB::components
প্রকৃতপক্ষে অপরিবর্তিত আচরণ e অর্থ ইউনিয়নের কোনও সদস্যের কাছ থেকে পড়া যা সম্প্রতি লেখা হয়েছে তা অপরিজ্ঞাত আচরণের দিকে নিয়ে যায়। এটি যদি ইউনিয়নগুলির উদ্দেশ্যে ব্যবহার না হয় তবে কী? কেউ দয়া করে এটিকে বিস্তৃতভাবে ব্যাখ্যা করতে পারেন?
হালনাগাদ:
আমি অনড় দৃষ্টিতে কয়েকটি বিষয় পরিষ্কার করতে চেয়েছিলাম।
- প্রশ্নের উত্তর সি এবং সি ++ এর জন্য এক নয়; আমার অজ্ঞ অল্প বয়স্ক স্ব এটিকে সি এবং সি ++ উভয় হিসাবে ট্যাগ করেছেন।
- সি ++ ১১-এর মানদণ্ডের মাধ্যমে ঝাঁকুনির পরে আমি শেষ পর্যন্ত বলতে পারি না যে এটি অ-সক্রিয় ইউনিয়ন সদস্যের অ্যাক্সেস / পরিদর্শনকে অনির্ধারিত / অনির্ধারিত / বাস্তবায়ন-সংজ্ঞায়িত। আমি যা খুশি তা হ'ল § 9.5 / 1:
যদি একটি স্ট্যান্ডার্ড-লেআউট ইউনিয়নে বেশ কয়েকটি স্ট্যান্ডার্ড-লেআউট স্ট্রাক্ট থাকে যা একটি সাধারণ প্রাথমিক ক্রম ভাগ করে দেয় এবং যদি এই স্ট্যান্ডার্ড-লেআউট ইউনিয়ন ধরণের কোনও স্ট্যান্ডার্ড-লেআউট স্ট্রাক্ট থাকে তবে এটির যে কোনও সাধারণ প্রাথমিক ক্রমটি পরীক্ষা করার অনুমতি দেওয়া হয় স্ট্যান্ডার্ড-লেআউট স্ট্রাক্ট সদস্যদের। §৯.২ / ১৯: দুটি স্ট্যান্ডার্ড-লেআউট স্ট্রাক্ট একটি সাধারণ প্রাথমিক ক্রম ভাগ করে যদি সংশ্লিষ্ট সদস্যদের লেআউট-সামঞ্জস্যপূর্ণ প্রকার থাকে এবং উভয় সদস্যই বিট-ফিল্ড হয় না বা উভয়ই এক বা একাধিক প্রাথমিকের ক্রমের জন্য একই প্রস্থের বিট-ক্ষেত্র হয় সদস্যরা।
- সিতে থাকাকালীন (সি 99 টিসি 3 - ডিআর 283 এর পরে) এটি করা বৈধ ( এই বিষয়টি সামনে আনার জন্য পাসকেল কুয়াককে ধন্যবাদ )। যাইহোক, এটির চেষ্টা করা এখনও অপরিজ্ঞাত আচরণের দিকে পরিচালিত করতে পারে , যদি মানটি পাঠ করা হয় তবে এটি যে ধরণের মাধ্যমে পড়া হয় তার জন্য অবৈধ (তথাকথিত "ট্র্যাপ প্রতিনিধিত্ব") বলে মনে হয়। অন্যথায়, মান পঠন বাস্তবায়ন সংজ্ঞায়িত করা হয়।
সি 98/90 এটিকে অনির্ধারিত আচরণের আওতায় আনা হয়েছে (আনেক্স জে) এবং কে অ্যান্ড আর এর বই বলছে এটির বাস্তবায়ন সংজ্ঞায়িত হয়েছে। কে অ্যান্ড আর এর উদ্ধৃতি:
এটি ইউনিয়নের উদ্দেশ্য - একক ভেরিয়েবল যা বৈধভাবে বিভিন্ন ধরণের যে কোনও একটিকে ধরে রাখতে পারে। [...] যতক্ষণ ব্যবহার সামঞ্জস্যপূর্ণ: পুনরুদ্ধার করা টাইপটি সম্প্রতি সঞ্চিত ধরণ হতে হবে। বর্তমানে কোন ইউনিয়নে কোন ধরণের সঞ্চিত রয়েছে তা ট্র্যাক করা প্রোগ্রামারের দায়িত্ব; ফলগুলি বাস্তবায়ন-নির্ভর হয় যদি কোনও কিছু এক ধরণের হিসাবে সঞ্চিত থাকে এবং অন্য হিসাবে উত্তোলিত হয়।
স্ট্রস্ট্রপের টিসি ++ পিএল থেকে জোর দেওয়া (জোর দেওয়া খনি)
"জাতীয় রূপান্তর " টাইপের জন্য কখনও কখনও অপব্যবহার করা ডেটাগুলির সংযোগের জন্য ইউনিয়নগুলির ব্যবহার অপরিহার্য হতে পারে ।
সর্বোপরি, এই প্রশ্নটি (যাঁর শিরোনামটি আমার জিজ্ঞাসা হওয়ার পরেও অপরিবর্তিত রয়েছে) ইউনিয়নগুলির উদ্দেশ্য বোঝার উদ্দেশ্য নিয়ে উত্থাপিত হয়েছিল এবং আদর্শটি কীভাবে পুনরায় ব্যবহারের জন্য উত্তরাধিকার ব্যবহারের বিষয়টি সি ++ স্ট্যান্ডার্ড দ্বারা অনুমোদিত তা নয়, তবে এটি উত্তরাধিকারকে C ++ ভাষা বৈশিষ্ট্য হিসাবে পরিচয় করানোর উদ্দেশ্য বা আসল উদ্দেশ্য ছিল না । এ কারণেই অ্যান্ডির উত্তর গ্রহণযোগ্য হিসাবে এখনও অবিরত রয়েছে।
scouring C++11's standard I couldn't conclusively say that it calls out accessing/inspecting a non-active union member is undefined [...] All I could find was §9.5/1
... তাই? অনুচ্ছেদের শুরুতে আপনি একটি ব্যতিক্রম নোটটি উদ্ধৃত করেছেন, মূল পয়েন্টটি নয় : "একটি ইউনিয়নে, অ স্থিতিশীল ডেটা সদস্যদের মধ্যে সর্বাধিক একজন যে কোনও সময় সক্রিয় হতে পারে, এটি হ'ল বেশিরভাগের মধ্যে একটির মান অ স্থির ডেটা সদস্যদের যে কোনও সময় ইউনিয়নে সংরক্ষণ করা যায়। " - এবং নীচে পি 4: "সাধারণভাবে, একটি ইউনিয়নের সক্রিয় সদস্য পরিবর্তন করতে একজনকে অবশ্যই স্পষ্টকামী ডেস্ট্রাক্টর কল এবং নতুন অপারেটর ব্যবহার করতে হবে "
b, g, r,
এবংa
এটি সামঞ্জস্যপূর্ণ নাও হতে পারে এবং এইভাবে একটি এর বিন্যাসের সাথে মেলে নাuint32_t
। এটি অন্যের দিকে ইঙ্গিত করেছে এমন শেষের দিকের বিষয়গুলি ছাড়াও।