সি ++ বেনামে স্ট্রাক্টকে কেন অস্বীকার করে?


93

কিছু সি ++ সংকলক বেনামে ইউনিয়ন এবং স্ট্রাক্টকে স্ট্যান্ডার্ড সি ++ এর এক্সটেনশন হিসাবে অনুমতি দেয়। এটি কিছুটা সিনট্যাকটিক চিনি যা মাঝেমধ্যে খুব সহায়ক।

যুক্তি কী যা এইটিকে স্ট্যান্ডার্ডের অংশ হতে বাধা দেয়? এখানে কি কোনও প্রযুক্তিগত বাধা আছে? একটি দার্শনিক? বা শুধু যথেষ্ট প্রমাণের প্রয়োজন নেই?

আমি যা বলছি তার একটি নমুনা এখানে:

struct vector3 {
  union {
    struct {
      float x;
      float y;
      float z;
    };
    float v[3];
  };
};

আমার সংকলক এটি গ্রহণ করবে তবে এটি সতর্ক করে যে "নামবিহীন কাঠামো / ইউনিয়ন" সি ++ তে একটি মানহীন এক্সটেনশন


4
আপনি কী বলতে চাইছেন তা সম্পর্কে স্পষ্টতই কিছু বিভ্রান্তি রয়েছে। আপনি দয়া করে কোডের একটি উদাহরণ প্রদান করতে পারেন যা কেবলমাত্র একটি সংকলক এক্সটেনশনের কারণে সংকলন করে?
রব কেনেডি

75
লক্ষ্য করুন যে দুটি ধারণা রয়েছে, এটি একই শব্দ, তবে সম্পূর্ণ পৃথক: নামবিহীন স্ট্রাক্ট এবং বেনামে স্ট্রাইক । প্রথমটি এটি, যা সি ++ সমর্থন করে: struct { int i; } a; a.i = 0;(ধরণের কোনও নাম নেই)। দ্বিতীয়টি হ'ল এটি, যা সি ++ সমর্থন করে না : struct { int i; }; i = 0;(ধরণের কোনও নাম নেই এবং এটি আশেপাশের সুযোগে পালিয়ে যায়)। সি ++ তবে নামহীন এবং বেনামে উভয় ইউনিয়নকে সমর্থন করে
জোহানেস স্কাউব -

এটি দেখতে বরং আকর্ষণীয় VMMLib ভেক্টর লাইব্রেরির মতো দেখাচ্ছে। আমি বিশ্বাস করি সমস্যাটি হ'ল ইউনিয়নে একটি নামহীন কাঠামো রয়েছে তবে আমি নিশ্চিত নই।
গ্রেফ্যাড

4
FWIW হয়েছে "anonmyous", "নামহীন" না এবং ইউনিয়ন করছে সমর্থিত যেমন litb বলেছেন। stackoverflow.com/q/14248044/560648
অরবিট

4
@ অ্যাড্রিয়ানম্যাকার্থি: এটি দুর্দান্ত (এফএসভিও "ফাইন"; পেসকি সংকলক রহস্যজনক), তবে অবিকল "নামবিহীন" একটি সম্পর্কযুক্ত, মানক ধারণা।
অরবিটে

উত্তর:


50

অন্যরা যেমন চিহ্নিত করেছে বেনাম ইউনিয়নগুলি স্ট্যান্ডার্ড সি ++ এ অনুমোদিত তবে বেনামে স্ট্রাইকগুলি নেই।

এর কারণ হ'ল সি বেনাম ইউনিয়নগুলিকে সমর্থন করে তবে বেনামে স্ট্রাকস নয় *, সুতরাং সি ++ প্রাক্তনটিকে সামঞ্জস্যের জন্য সমর্থন করে তবে পরবর্তীকালে নয় কারণ এটি সামঞ্জস্যতার জন্য প্রয়োজন হয় না।

তদ্ব্যতীত, সি ++ তে বেনামে স্ট্রোকগুলির খুব বেশি ব্যবহার নেই। ব্যবহার আপনি প্রদর্শন, একটি struct তিন ভাসে যার দ্বারা পারেন উল্লেখ করা যেতে পারে ধারণকারী আছে .v[i], অথবা .x, .yএবং .z++ আমি সি অনির্ধারিত আচরণ ফলাফল বিশ্বাস করি। সি ++ আপনাকে কোনও ইউনিয়নের একজন সদস্যকে লিখতে, বলতে .v[1]এবং তার পরে অন্য সদস্যের কাছ থেকে পড়ার অনুমতি দেয় না , বলুন .y। যদিও কোডগুলি এটি অস্বাভাবিক নয় তবে এটি আসলে ভালভাবে সংজ্ঞায়িত হয় না।

ব্যবহারকারী সংজ্ঞায়িত প্রকারের জন্য সি ++ এর সুবিধাগুলি বিকল্প সমাধান সরবরাহ করে। উদাহরণ স্বরূপ:

struct vector3 {
  float v[3];
  float &operator[] (int i) { return v[i]; }
  float &x() { return v[0]; }
  float &y() { return v[1]; }
  float &z() { return v[2]; }
};

* সি 11 স্পষ্টতই বেনামে স্ট্রাক্ট যুক্ত করে, তাই ভবিষ্যতে সি ++ এ সংশোধন সেগুলি যুক্ত করতে পারে।


4
+1: আমার উদাহরণটি সি ++ তে অপরিবর্তিত আচরণের উপর নির্ভর করে - প্রশ্নটি লেখার সময় আমি কখনই পিছনে সচেতন ছিলাম না।
অ্যাড্রিয়ান ম্যাকার্থি

4
"সি ++ আপনাকে কোনও ইউনিয়নের একজন সদস্যকে লেখার অনুমতি দেয় না [...] এবং তারপরে অন্য সদস্যের কাছ থেকে পড়তে হবে" - যদি না বলা হয় যে সদস্যগণ স্ট্যান্ডার্ড-লেআউট অবজেক্ট এবং নিজের সদস্যদের একটি সাধারণ প্রাথমিক ক্রম ভাগ না করেন এবং আপনি ' পুনরায় লিখতে / তাদের সদস্যদের পড়া সাধারণ প্রাথমিক ক্রম বলে। যে হয় অনুমতি (অর্থাত সংজ্ঞায়িত)।
আন্ডারস্কোর_

4
@ মাউন্ডস_ডি: হ্যাঁ, প্রকারগুলি যদি সাধারণ প্রাথমিক ক্রম সহ স্ট্যান্ডার্ড লেআউট হয়। তবে কোনও স্ট্রাক্ট কখনই এইভাবে অ্যারের সাথে আলেস রাখতে পারে না , কারণ সি ++ এর "সাধারণ প্রাথমিক ক্রম" নিয়মটি বলে যে একটি সাধারণ প্রাথমিক ক্রম কেবল স্ট্রাক্টের মধ্যেই হতে পারে । অ্যারেগুলি উল্লেখ করা হয়নি, সুতরাং তারা এটির মতো নাম রাখতে পারে না।
নিকল বোলাস

@ নিকলবোলাস ওহ, হাহা - আমাকে বিশ্বাস করুন - আমি অনেকবার ইচ্ছা করেছি যে অ্যারে এবং অন্যান্য আদিমরা এই ভাতার মধ্যে অন্তর্ভুক্ত ছিল! তবে আমি এর উপর সম্ভাব্য ব্যবহারিক সীমাবদ্ধতাগুলি সম্পর্কে খুব বেশি চিন্তা করিনি, সম্ভবত এটি এখনকার মতো সহজ নয়। আমার মন্তব্যটি আরও সাধারণ ছিল তবে আমি বাদ দিয়ে এই ধারণাটি ঝুঁকির মধ্যে ফেলেছি যে এইগুলিতে অ্যারেগুলি অন্তর্ভুক্ত করা হয়েছে, সুতরাং এতে যোগ করার জন্য ধন্যবাদ।
আন্ডারস্কোর_২২

"এর কারণ হ'ল সি বেনাম ইউনিয়নগুলিকে সমর্থন করে তবে বেনামে স্ট্রাক্টগুলি সমর্থন করে না" - না। আপনার পাদটীকা স্পষ্ট করে যে আপনি C99 বা তার আগে এখানে কথা বলছিলেন। "বেনামে ইউনিয়ন" শব্দটি C99 স্ট্যান্ডার্ডের কোথাও উপস্থিত হয় না। জিসিসি একটি ডায়াগোনস্টিকের (-std = c99 -pedantic বিকল্প সহ) দাবি করে যে "ISO C99 নামবিহীন স্ট্রাইক / ইউনিয়নগুলি সমর্থন করে না"। স্ট্যান্ডার্ডটিতে নামবিহীন বিট-ফিল্ড ছাড়া অন্য নামহীন সদস্যদের সম্পর্কে কিছু উল্লেখ করা হয়নি। স্ট্রাক্ট-ডিক্লেয়ারেশনগুলি ঘোষণা হয় কিনা তা সম্পর্কে আমি পুরোপুরি নিশ্চিত নই, তবে যদি তা হয় তবে বেনাম ইউনিয়নগুলি 6.7p2 প্রতি সীমাবদ্ধ লঙ্ঘন, সর্বোত্তমভাবে সংজ্ঞায়িত।

21

আমি বলব, আপনি vector3কেবলমাত্র একটি ব্যবহার করে আপনার ঘোষণাটি পরিষ্কার করতে পারেনunion

union vector3 {
  struct { float x, y, z; } ;
  float v[3] ;
} ;

নিশ্চিত, বেনামী কাঠামো ছিল একটি MSVC এক্সটেনশন । তবে আইএসও সি 11 এটি এখনই অনুমতি দেয় এবং জিসিসি এটির অনুমতি দেয় এবং অ্যাপলের এলএলভিএম সংকলকও এটি করে।

সি 11 এ কেন এবং সি ++ 11 নয়? আমি নিশ্চিত নই, তবে কার্যত বেশিরভাগ ক্ষেত্রে (জিসিসি ++, এমএসভিসি ++ এবং অ্যাপলের সি ++ সংকলক) সি ++ সংকলকগুলি তাদের সমর্থন করে support


4
আপডেট করা তথ্যের জন্য +1। আমার বাইরের কাঠামো থাকার কারণটি ছিল কারণ "রিয়েল কোড" এরও পদ্ধতি ছিল।
অ্যাড্রিয়ান ম্যাকার্থি

ইউনিয়নের সাথে আপনি যে জিনিসগুলি করতে পারবেন না তা হ'ল স্থায়ী ডেটা সদস্য, বা উত্তরাধিকার ব্যবহার
বোবোবোবো

4
ধন্যবাদ আমি কখনই নতুন ইউনিয়ন স্ট্রাক্ট বা শ্রেণীর মতো ব্যবহার করতে পারি না।
অ্যাড্রিয়ান ম্যাকার্থি

আমি জানি যে সান স্টুডিওগুলি ডিফল্টরূপে সি ++ 11 এর আগে বেনামি কাঠামো সমর্থন করে না। যদি আপনি ক্রস প্ল্যাটফর্ম কোড লিখছেন এবং সংকলকগুলি সি + 11 এ আপগ্রেড করা হয়নি তবে বেনামি স্ট্রাক্ট ব্যবহার করবেন না।
ইরিসিস

5

আপনি কি বোঝাতে চেয়েছেন তা নিশ্চিত না। সি ++ অনুচ্ছেদের 9.5 ধারা, ধারা 2:

ফর্মের একটি ইউনিয়ন

union { member-specification } ;

নামহীন ইউনিয়ন বলা হয়; এটি নামবিহীন প্রকারের একটি নামহীন অবজেক্টটি সংজ্ঞায়িত করে।

আপনি এ জাতীয় জিনিসও করতে পারেন:

void foo()
{
  typedef
  struct { // unnamed, is that what you mean by anonymous?
    int a;
    char b;
  } MyStructType; // this is more of a "C" style, but valid C++ nonetheless

  struct { // an anonymous struct, not even typedef'd
    double x;
    double y;
  } point = { 1.0, 3.4 };
}

সবসময় খুব দরকারী না ... যদিও কখনও কখনও বাজে ম্যাক্রো সংজ্ঞাতে দরকারী।


13
-1 কারণ এটি বলছে যে এটি একটি বেনামি কাঠামো সংজ্ঞায়িত করে। প্রশ্নের উপরের মন্তব্যগুলি দেখুন - আপনি একটি বেনামে স্ট্রাক্ট সংজ্ঞায়িত করছেন, বেনামে নয়।
জোহানেস স্কাউব - ২:4

1

ইউনিয়নগুলি বেনামে থাকতে পারে; স্ট্যান্ডার্ড, 9.5 অনুচ্ছেদ 2 দেখুন।

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


1

সম্পাদনা, মন্তব্য এবং এই এমএসডিএন নিবন্ধটির ভিত্তিতে: বেনামি কাঠামো , আমি একটি অনুমানকে ঝুঁকিপূর্ণ করব - এটি এনক্যাপসুলেশন ধারণার সাথে খারাপভাবে ফিট করে। আমি ক্লাসের কোনও সদস্যকে কেবলমাত্র একজন সদস্য যুক্ত করার বাইরে আমার শ্রেণীর নাম স্থানটি নিয়ে গণ্ডগোল করার আশা করব না। তদুপরি, বেনামে কাঠামোয় পরিবর্তনগুলি আমার অনুমতি ব্যতীত আমার ক্লাসকে প্রভাবিত করতে পারে।


4
বেনামে স্ট্রাক্ট / ইউনিয়নগুলি যেভাবে তৈরি করা হয়েছে তার কারণে (এটি বিশেষ, ইনলাইন সিনট্যাক্স যা ম্যাক্রো ব্যতীত লুকানো যায় না) আপনি অবাক হতে পারবেন না যে আপনি যে কোনও সদস্য ব্যবহার করছেন তা বেনামে সদস্য। সুতরাং আমি মনে করি না এই যুক্তিটি কোনও অর্থবোধ করে। প্রকৃত কারণ বেনামী ইউনিয়ন হয় হয় সি ++ সমর্থিত, সি সামঞ্জস্য জন্য শুধুমাত্র। সি বেনামে স্ট্রাইকগুলি (সি 11 পর্যন্ত) সমর্থন করে না এবং তাই সি ++ হয় না doesn't
bames53

1

তোমার গোপন সংকেত

union {
  struct {
    float x;
    float y;
    float z;
  };
  float v[3];
};

মত

union Foo {
   int;
   float v[3];
};

যা অবশ্যই অবৈধ (সি 99 এবং এর আগে)।

কারণ সম্ভবত পার্সিংকে সহজতর করা (সি তে), কারণ সেক্ষেত্রে আপনাকে কেবল এটি পরীক্ষা করতে হবে যে স্ট্রাক্ট / ইউনিয়ন সংস্থার কেবল "ঘোষক বিবৃতি" আছে

Type field;

এটি বলেছিল, জিসিসি এবং "অন্যান্য সংকলক" নামবিহীন ক্ষেত্রগুলিকে এক্সটেনশন হিসাবে সমর্থন করে।

সম্পাদনা করুন: বেনামি স্ট্রাক্টগুলি এখন আনুষ্ঠানিকভাবে সি 11 (.76.7.2.1 / 13) এ সমর্থিত।


4
পার্সিং দৃষ্টিকোণ থেকে, আমি এটির union { ... }চেয়ে আলাদা মনে করি না struct { ... }। পূর্বেরটি বৈধ, তবে দ্বিতীয়টি বৈধ নয়।
জোহানেস স্কাউব -

4
সাধারণভাবে পার্স করা কতটা অযৌক্তিকভাবে সি +++++++++++++++++++ এর মধ্যে আমি সন্দেহ করি যে পার্সিংকে সহজ করার জন্য মানহীন প্রতিশ্রুতিবদ্ধ নামহীন স্ট্রাক্ট এবং ইউনিয়নগুলি অনুমোদিত নয় allow
অ্যাড্রিয়ান ম্যাকার্থি

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

@ অ্যাড্রিয়ান, সেখানে অ্যাড্রিয়ান ভালো কথা, আমি সবসময় ভাবিনি "বাস্তবায়ন করা খুব কঠিন" কখনই
বর্জন

সি এবং সি ++ উভয়ই নামবিহীন ইউনিয়নগুলিকে সমর্থন করে, সুতরাং যে মন্তব্যটি union { ... };অবৈধ তা সঠিক নয়।
bames53
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.