ফরোয়ার্ড সি ++ এ এনাম ঘোষণা করে


263

আমি নীচের মতো কিছু করার চেষ্টা করছি:

enum E;

void Foo(E e);

enum E {A, B, C};

যা সংকলক প্রত্যাখ্যান করে। আমি গুগলে একটি তাত্ক্ষণিকভাবে নজর রেখেছি এবং theকমত্যটি "আপনি এটি করতে পারবেন না" বলে মনে হচ্ছে তবে কেন তা বুঝতে পারি না। কেউ কি ব্যাখ্যা করতে পারেন?

স্পেসিফিকেশন ২: আমি এই ক্লাসে আমার ব্যক্তিগত পদ্ধতি রয়েছে বলে এনাম বলেছিলেন, আমি এনামের মূল্যবোধগুলি উন্মোচিত করতে চাই না - তাই উদাহরণস্বরূপ, আমি চাই না যে কাউকে জানতে হবে যে ই হিসাবে সংজ্ঞায়িত করা হয়েছে

enum E {
    FUNCTIONALITY_NORMAL, FUNCTIONALITY_RESTRICTED, FUNCTIONALITY_FOR_PROJECT_X
}

প্রকল্প এক্স হিসাবে এমন কিছু নয় যা আমি আমার ব্যবহারকারীদের সম্পর্কে জানতে চাই।

সুতরাং, আমি এনামটি ঘোষণা করতে চেয়েছিলাম যাতে আমি ব্যক্তিগত পদ্ধতিগুলি শিরোলেখ ফাইলটিতে রাখতে পারি, এনপিকে অভ্যন্তরীণভাবে সিপিপিতে ঘোষণা করতে পারি, এবং বিল্ট গ্রন্থাগার ফাইল এবং শিরোনামকে লোকদের মধ্যে বিতরণ করতে পারি।

সংকলক হিসাবে - এটি জিসিসি।


এটির বহু বছর ধরে এবং কোনওভাবে স্ট্যাকওভারফ্লো আমাকে ফিরিয়ে দেয়;) পোস্টমর্টেমের পরামর্শ হিসাবে - বিশেষত আপনি যে দৃশ্যের বর্ণনা দিয়েছেন তাতে এটি করবেন না । আমি একটি বিমূর্ত ইন্টারফেসটি সংজ্ঞায়িত করতে এবং এই টোটোগুলি ব্যবহারকারীদের প্রকাশ করতে এবং এনাম সংজ্ঞা এবং অন্যান্য সমস্ত প্রয়োগের বিশদটি অভ্যন্তরীণ বাস্তবায়নের সাথে রাখতে চাই যা অন্য কেউ আমার পক্ষ থেকে যখনই আমাকে যা করতে দেয় এবং যখন ব্যবহারকারীরা দেখেন তার পুরো নিয়ন্ত্রণ থাকে কিছু.
আরএনআর

উত্তর:


216

এনামকে এগিয়ে না দেওয়ার কারণটি হ'ল মানগুলি না জেনে কম্পাইলার এনাম ভেরিয়েবলের জন্য প্রয়োজনীয় স্টোরেজটি জানতে পারে না। সি ++ সংকলককে নির্দিষ্ট করা সমস্ত মান অন্তর্ভুক্ত করার জন্য প্রয়োজনীয় আকারের ভিত্তিতে প্রকৃত স্টোরেজ স্পেস নির্দিষ্ট করার অনুমতি দেওয়া হয়। যদি যা কিছু দৃশ্যমান হয় তা হ'ল ফরোয়ার্ড ডিক্লেয়ারেশন, অনুবাদ ইউনিট স্টোরেজ আকারটি কী বেছে নিয়েছে তা জানতে পারে না - এটি একটি চর বা কোনও আন্ত বা অন্য কিছু হতে পারে।


আইএসও সি ++ স্ট্যান্ডার্ডের 7.2.5 বিভাগ থেকে:

অন্তর্নিহিত টাইপ একটি শুমার অবিচ্ছেদ্য যে ধরনের সব গণনাকারী শুমার সংজ্ঞায়িত মান উপস্থাপন করতে পারেন হয়। এটি রূপায়ণ-সংজ্ঞায়িত যা অন্তর্ভুক্ত টাইপ একটি গণনার জন্য অন্তর্নিহিত প্রকার হিসাবে ব্যবহৃত হয় তা বাদে অন্তর্নিহিত প্রকারের চেয়ে বড় হবে না intযতক্ষণ না একটি গণকের মান একটি intবা unsigned int। যদি গণনাকারী-তালিকা খালি, অন্তর্নিহিত ধরনের যেন শুমার মান 0. মান একটি একক গণনাকারী ছিল sizeof()একটি শুমার ধরন, শুমার প্রকারের একটি বস্তু, অথবা একটি গণনাকারী প্রয়োগ, মান sizeof()প্রয়োগ করা অন্তর্নিহিত ধরণ

যেহেতু ফাংশনটিতে কলকারীকে কল স্ট্যাকটি সঠিকভাবে সেট আপ করতে প্যারামিটারগুলির আকারগুলি অবশ্যই জানতে হবে, সুতরাং ফাংশন প্রোটোটাইপের আগে একটি গণনা তালিকায় অঙ্কের সংখ্যাটি অবশ্যই জানা উচিত।

আপডেট: সি ++ 0 এক্স-এ ফরওয়ার্ড ডিক্লেয়ারিং এনাম টাইপের জন্য একটি সিনট্যাক্স প্রস্তাবিত এবং স্বীকৃত হয়েছে। আপনি প্রস্তাবটি http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2764.pdf এ দেখতে পারেন


29
-1। আপনার যুক্তি সঠিক হতে পারে না - অন্যথায়, কেন আপনাকে "শ্রেণি সি" ফরোয়ার্ড-ডিক্লেয়ারের অনুমতি দেওয়া হচ্ছে; এবং তারপরে কোনও সম্পূর্ণ ফাংশন প্রোটোটাইপ ঘোষণা করুন যা সি কে পুরোপুরি সংজ্ঞায়নের আগে একটি সি নেয় বা ফেরত দেয়?
j_random_hacker 26'09

112
@ j_random: আপনি ক্লাসটি সম্পূর্ণরূপে সংজ্ঞায়িত করার আগে ব্যবহার করতে পারবেন না - আপনি কেবলমাত্র সেই শ্রেণীর একটি পয়েন্টার বা একটি রেফারেন্স ব্যবহার করতে পারেন এবং কারণ তাদের আকার এবং ক্রিয়াকলাপ শ্রেণিটি কী তার উপর নির্ভর করে না।
আরএনআর

27
কোনও শ্রেণীর অবজেক্টের রেফারেন্স বা পয়েন্টারের আকার সংকলক দ্বারা সেট করা হয়, এবং বস্তুর প্রকৃত আকারের চেয়ে পৃথক - এটি পয়েন্টার এবং রেফারেন্সের আকার। এনাম একটি অবজেক্ট এবং সঠিক স্টোরেজ অ্যাক্সেস করার জন্য কম্পাইলারের জন্য এর আকার প্রয়োজন।
কেজেএওয়াল্ফ

16
যৌক্তিকরূপে এটি এনামগুলিতে পয়েন্টার / রেফারেন্সগুলি ঘোষণা করতে সক্ষম হয় যদি আমাদের ক্লাসগুলি যেমন করতে পারে তেমন ফরওয়ার্ড-ডিক্লেয়ারিং এনাম থাকে। এটি ঠিক যে আপনি প্রায়শই এনামগুলিতে পয়েন্টারগুলি ব্যবহার করেন না :)
পাভেল মিনায়েভ

20
আমি জানি এই আলোচনাটি অনেক আগে শেষ হয়েছিল, তবে আমাকে এখানে @ j_random_hacker এর সাথে যুক্ত হতে হবে: এখানে সমস্যাটি পয়েন্টার বা অসম্পূর্ণ প্রকারের রেফারেন্সের বিষয়ে নয়, তবে ঘোষণায় অসম্পূর্ণ প্রকারের ব্যবহার সম্পর্কে। যেহেতু এটি আইনসম্মত struct S; void foo(S s);(নোটটি fooকেবলমাত্র ঘোষিত, সংজ্ঞায়িত নয়), সুতরাং আমরা ভাল করতে পারার কারণ নেই enum E; void foo(E e);। উভয় ক্ষেত্রেই আকারের প্রয়োজন হয় না।
লুক টুরাইল

198

সি ++ 11 থেকে এনামগুলির ফরোয়ার্ড ঘোষণা সম্ভব। পূর্বে, এনামের ধরণগুলি ফরোয়ার্ড না করার কারণটি কারণ গণনার আকার তার বিষয়বস্তুর উপর নির্ভর করে। যতক্ষণ না অ্যাপলিকেশন দ্বারা অঙ্কের আকার নির্দিষ্ট করা থাকে, ততক্ষণ এটি ঘোষণা করা যেতে পারে:

enum Enum1;                   //Illegal in C++ and C++0x; no size is explicitly specified.
enum Enum2 : unsigned int;    //Legal in C++0x.
enum class Enum3;             //Legal in C++0x, because enum class declarations have a default type of "int".
enum class Enum4: unsigned int; //Legal C++0x.
enum Enum2 : unsigned short;  //Illegal in C++0x, because Enum2 was previously declared with a different type.

1
এই বৈশিষ্ট্যের জন্য কোনও সংকলক সমর্থন আছে? জিসিসি 4.5 এর মনে হচ্ছে না :(
রুবেনভবি

4
@ রুবেনভব তাই ভিজ্যুয়াল সি ++ 11 (2012) ব্লগস.এমএসএনএন
বি /

আমি এনাম 32_ টি এবং আপনার উত্তর এনএমএক্স-এর সাথে খুঁজছিলাম: uint32_t {a, b, c};
কল্পনাশালী

আমি ভেবেছিলাম স্কোপড এনামগুলি (এনাম ক্লাস) সি ++ 11 এ প্রয়োগ করা হয়েছিল? যদি তা হয় তবে সি ++ 0 এক্স-এ তারা কীভাবে আইনী?
Terrabits

1
আনুষ্ঠানিকভাবে মানক হওয়ার আগে সি ++ 0x, সি ++ 11, @ টারাবাইটের কার্যকরী নাম ছিল। যুক্তিটি হ'ল যদি কোনও বৈশিষ্ট্য কোনও আপডেট স্ট্যান্ডার্ডের অন্তর্ভুক্ত হিসাবে পরিচিত (বা খুব সম্ভবত) হয় তবে স্ট্যান্ডার্ডটি আনুষ্ঠানিকভাবে প্রকাশের আগে সেই বৈশিষ্ট্যটির ব্যবহার কাজের নাম ব্যবহার করতে ঝোঁক। (উদাহরণস্বরূপ, ২০১১ সালে অফিসিয়াল মানীকরণের পূর্বে সি ++ ১১ টি বৈশিষ্ট্যকে সমর্থনকারী সংকলকগুলিতে সি ++ 0x সমর্থন ছিল, সরকারী মানক হওয়ার আগে সি ++ 17 বৈশিষ্ট্যগুলিকে সমর্থনকারী সংকলক এবং সি ++ 20 বৈশিষ্ট্যগুলিকে সমর্থনকারী সংকলকগুলি এই মুহূর্তে (2019) এর C ++ 2a সমর্থন রয়েছে))
জাস্টিন সময় - মনিকা পুনরায়

79

সাম্প্রতিক ঘটনাবলি প্রদত্ত আমি এখানে একটি আপ-টু ডেট উত্তর যুক্ত করছি।

আপনি সি ++ 11 এ এনাম ফরওয়ার্ড-ডিক্লেয়ার করতে পারেন, আপনি যতক্ষণ না একই সময়ে তার স্টোরেজ প্রকারটি ঘোষণা করেন। সিনট্যাক্সটি দেখতে এমন দেখাচ্ছে:

enum E : short;
void foo(E e);

....

enum E : short
{
    VALUE_1,
    VALUE_2,
    ....
}

প্রকৃতপক্ষে, যদি ফাংশনটি কখনই গণনার মানকে বোঝায় না, আপনার সেই মুহুর্তে সম্পূর্ণ ঘোষণার দরকার নেই।

এটি G ++ 4.6 এবং এর পরে ( -std=c++0xবা -std=c++11আরও সাম্প্রতিক সংস্করণে) দ্বারা সমর্থিত । ভিজ্যুয়াল সি ++ 2013 এটি সমর্থন করে; পূর্ববর্তী সংস্করণগুলিতে এটির একধরনের মানক সমর্থন রয়েছে যা আমি এখনও বের করতে পারি নি - আমি কিছু পরামর্শ পেয়েছি যে একটি সহজ ফরোয়ার্ড ঘোষণাপত্র বৈধ, তবে ওয়াইএমএমভি।


4
+1 কারণ এটিই কেবলমাত্র একমাত্র উত্তর যা আপনাকে আপনার ঘোষণার ধরণের পাশাপাশি আপনার সংজ্ঞার বিবরণ উল্লেখ করতে হবে বলে উল্লেখ করে।
তুরুনি

আমি বিশ্বাস করি যে এমএসভিসির প্রথম দিকে আংশিক সমর্থনটি সি ++ / সিএলআই এর enum classসি ++ এক্সটেনশন (সি ++ এর 11 এর আগে enum class) হিসাবে অন্ততপক্ষে সমর্থন করা হয়েছিল, যদি আমি সঠিকভাবে মনে করি তবে। সংকলকটি আপনাকে এনুমের অন্তর্নিহিত ধরণের নির্দিষ্টকরণের অনুমতি দেয়, তবে enum classএনামগুলিকে সমর্থন বা ফরোয়ার্ড ঘোষিত হয়নি , এবং আপনাকে সতর্ক করে দিয়েছিল যে এনুমের স্কোপ সহ একজন গণ্যকারীর যোগ্যতা অর্জন করা একটি মানহীন এক্সটেনশন ছিল। আমি মনে করি এটি প্রায় বিরক্তিকর ছাড়া C ++ 11 এর অন্তর্নিহিত ধরণের নির্দিষ্টকরণের মতো কাজ করছে কারণ আপনাকে সতর্কতাটি দমন করতে হয়েছিল।
জাস্টিন সময় - মনিকা পুনরায়

30

সি ++ এ জিনিসগুলি ফরোয়ার্ড ঘোষণা খুব দরকারী কারণ এটি নাটকীয়ভাবে সংকলনের সময়ের গতি বাড়ায় । আপনি এগিয়ে সহ সি কয়েকটি জিনিস ++, ডিক্লেয়ার করতে পারেন: struct, class, function, ইত্যাদি ...

তবে আপনি কি enumC ++ এ একটি ঘোষণা করতে পারেন ?

না আপনি পারবেন না।

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

ভুল।

সি ++ enumতে সি # (অন্তর্) এর মতো কোনও ডিফল্ট টাইপ নেই । সি ++ এ আপনার enumটাইপটি সংকলক দ্বারা নির্ধারণ করা হবে যে কোনও ধরণের যা আপনার জন্য মূল্যমানের সীমার সাথে মানিয়ে যাবে enum

ওটার মানে কি?

এর অর্থ হ'ল আপনার enumএর অন্তর্নিহিত প্রকারটি সম্পূর্ণরূপে নির্ধারণ করা যায় না যতক্ষণ না আপনি সমস্ত মানগুলির মান না পেয়ে থাকেনenum সংজ্ঞায়িত সংজ্ঞায়িত । কোন ম্যান আপনি নিজের ঘোষণা এবং সংজ্ঞা আলাদা করতে পারবেন না enum। এবং সেইজন্য আপনি enumC ++ এ একটি ঘোষণা করতে পারবেন না ।

আইএসও সি ++ স্ট্যান্ডার্ড এস 7.2.5:

একটি গণনার অন্তর্নিহিত ধরণ হ'ল একটি অবিচ্ছেদ্য প্রকার যা গণনাতে সংজ্ঞায়িত সমস্ত গণকের মানকে উপস্থাপন করতে পারে। এটি রূপায়ণ-সংজ্ঞায়িত যা অন্তর্ভুক্ত টাইপ একটি গণনার জন্য অন্তর্নিহিত প্রকার হিসাবে ব্যবহৃত হয় তা বাদে অন্তর্নিহিত প্রকারের চেয়ে বড় হবে না intযতক্ষণ না একটি গণকের মান একটি intবা unsigned int। যদি গণনা-তালিকা খালি থাকে তবে অন্তর্নিহিত প্রকারটি হ'ল গণকের 0 মান সহ একটি একক গণক রয়েছেsizeof() একটি শুমার ধরন, শুমার প্রকারের একটি বস্তু, অথবা একটি গণনাকারী প্রয়োগ, মান sizeof()প্রয়োগ করা অন্তর্নিহিত ধরণ

আপনি sizeofঅপারেটরটি ব্যবহার করে সি ++ তে একটি অঙ্কিত প্রকারের আকার নির্ধারণ করতে পারবেন । গণিত প্রকারের আকারটি এর অন্তর্নিহিত ধরণের আকার। আপনার কম্পাইলারটি আপনার জন্য কোন ধরণের ব্যবহার করছে তা আপনি অনুমান করতে পারেন enum

আপনি যদি আপনার ধরণের enumস্পষ্টরূপে নির্দিষ্ট করে থাকেন তবে কী হবে :

enum Color : char { Red=0, Green=1, Blue=2};
assert(sizeof Color == 1);

তারপরে আপনি কি আপনার ঘোষণা করতে পারেন enum?

না, তবে কেন নয়?

কোনটির ধরণ উল্লেখ করা enumআসলে বর্তমান সি ++ মানের অংশ নয়। এটি একটি ভিসি ++ এক্সটেনশন। যদিও এটি সি ++ 0x এর অংশ হবে।

উৎস


14
এই উত্তরটি এখন বেশ কয়েক বছরের পুরানো।
টম

সময় আমাদের সকলকে বোকা বানায়। আপনার মন্তব্যটি এখন বেশ কয়েক বছরের পুরানো; এক দশকের উত্তর!
pjcard

14

[আমার উত্তরটি ভুল, তবে মন্তব্যগুলি দরকারী বলেই আমি এটি এখানে রেখে এসেছি]।

ফরওয়ার্ড ডিক্লেয়ারিং এনামগুলি মানহীন, কারণ বিভিন্ন এনামের ধরণের পয়েন্টারগুলি একই আকারের গ্যারান্টিযুক্ত নয়। এই ধরণের সাথে কী আকারের পয়েন্টার ব্যবহার করা যেতে পারে তা জানতে সংকলকটির সংজ্ঞাটি দেখতে হবে।

অনুশীলনে, কমপক্ষে সমস্ত জনপ্রিয় সংকলকগুলিতে, এনামগুলিতে পয়েন্টারগুলি একটি সামঞ্জস্যপূর্ণ আকার। উদাহরণস্বরূপ, ভিজ্যুয়াল সি ++ দ্বারা এনামগুলির ফরোয়ার্ড ঘোষণাকে ভাষা বর্ধিতকরণ হিসাবে সরবরাহ করা হয়।


2
-1। যদি আপনার যুক্তি সঠিক হয় তবে একই যুক্তিটি বোঝায় যে শ্রেণীর ধরণের অগ্রণী ঘোষণাগুলি সেই ধরণের পয়েন্টার তৈরি করতে ব্যবহার করা যায় না - তবে তারা পারে।
j_random_hacker

6
+1 টি। যুক্তি সঠিক। নির্দিষ্ট ক্ষেত্রে হ'ল প্ল্যাটফর্ম যেখানে মাপের (চর *)> আকারের (ইন্ট *)। উভয়ই এনামের জন্য অন্তর্নিহিত ধরণের হতে পারে, সীমার উপর নির্ভর করে। শ্রেণীর অন্তর্নিহিত ধরণের নেই তাই সাদৃশ্যটি মিথ্যা।
এমসাল্টার্স

3
@ এসএমএলটার: উদাহরণ: "স্ট্রাক্ট এস {ইন্ট এক্স;};" এখন, আকারের (এস *) অবশ্যই অন্য কোনও পয়েন্টার-টু-স্ট্রাক্টের আকারের সমান হতে হবে , যেহেতু সি ++ এস এর সংজ্ঞা দেওয়ার আগে এই জাতীয় পয়েন্টারটি ঘোষিত এবং ব্যবহার করার অনুমতি দেয় ...
j_random_hacker

1
@ এসএমএলটার্স: ... এমন প্ল্যাটফর্মের যেখানে মাপের (চর *)> সাইজেরফ (ইনট *), এই নির্দিষ্ট কাঠামোর জন্য এই জাতীয় "পূর্ণ-আকার" পয়েন্টার ব্যবহার করা অকার্যকর হতে পারে তবে এটি নাটকীয়ভাবে কোডিংকে সহজতর করে - এবং ঠিক একই রকম এনাম ধরণের জন্য জিনিসটি করা উচিত এবং হওয়া উচিত।
j_random_hacker

4
তথ্যগুলিতে পয়েন্টার এবং ফাংশনগুলিতে পয়েন্টারগুলি বিভিন্ন আকারের হতে পারে তবে আমি নিশ্চিত যে ডেটা পয়েন্টারগুলিকে রাউন্ড-ট্রিপ করতে হবে (অন্য কোনও ডেটা পয়েন্টার টাইপ করতে হবে, তারপরে মূলটিতে ফিরে যেতে হবে, এখনও কাজ করতে হবে), যা বোঝায় যে সমস্ত ডেটা পয়েন্টার একই আকার।
বেন ভয়েগট

7

এনামের ফরওয়ার্ড ডিক্লেয়ারেশনের মতো আসলে কিছুই নেই। এনামের সংজ্ঞায় এমন কোনও কোড নেই যা এনাম ব্যবহার করে অন্যান্য কোডের উপর নির্ভর করতে পারে, আপনি প্রথমে এনামটি ঘোষণা করার সময় এটি পুরোপুরি সংজ্ঞায়িত করা কোনও সমস্যা নয়।

যদি আপনার এনামের একমাত্র ব্যবহার ব্যক্তিগত সদস্য ফাংশন দ্বারা হয় তবে আপনি এনামকে নিজেই সেই শ্রেণীর ব্যক্তিগত সদস্য হিসাবে রেখে এনক্যাপসুলেশন বাস্তবায়ন করতে পারেন। এনামটি এখনও ঘোষণার পয়েন্টে অর্থাৎ শ্রেণীর সংজ্ঞার মধ্যে পুরোপুরি সংজ্ঞায়িত করতে হবে। তবে, সেখানে প্রাইভেট সদস্যের কার্যকারিতা ঘোষণা করার মতো এটি কোনও বড় সমস্যা নয় এবং এর চেয়ে বাস্তবায়ন অভ্যন্তরীণ ক্ষেত্রগুলির চেয়ে খারাপ প্রকাশ নয়।

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


5

কেবল উল্লেখ করে যে কারণটি হ'ল এনামের আকারটি এখনও ঘোষণার পরে জানা যায়নি। ঠিক আছে, আপনি একটি স্ট্রাক্টের ফরোয়ার্ড ডিক্লারেশনটি চারপাশে কোনও পয়েন্টার পাস করতে সক্ষম হন বা এমন কোনও জায়গা থেকে কোনও অবজেক্টকে উল্লেখ করতে পারেন যা ফরওয়ার্ড ঘোষিত স্ট্রাক্ট সংজ্ঞাতে নিজেই উল্লিখিত হয়।

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

বর্তমান সি ++ স্ট্যান্ডার্ড স্পষ্টভাবে এরকম কিছু করতে অস্বীকার করে

enum X;

(ইন 7.1.5.3/1) কিন্তু পরবর্তী সি ++ স্ট্যান্ডার্ড আগামী বছরের কারণে নিম্নলিখিত, যা আমার সমস্যা আসলে বিশ্বাস পারবেন গেছে অন্তর্নিহিত টাইপ করতে হবে:

enum X : int;

এটি একটি "অস্বচ্ছ" এনাম ঘোষণা হিসাবে পরিচিত। এমনকি আপনি নিম্নলিখিত কোডে মান দ্বারা এক্স ব্যবহার করতে পারেন । এবং এর গণকগণকে পরবর্তীকালে গণনার একটি পুনঃ ঘোষণায় সংজ্ঞায়িত করা যেতে পারে। দেখুন 7.2বর্তমান পরিশ্রমী ড্রাফ্টে।


4

আমি এটি এইভাবে করব:

[পাবলিক শিরোনামে]

typedef unsigned long E;

void Foo(E e);

[অভ্যন্তরীণ শিরোনামে]

enum Econtent { FUNCTIONALITY_NORMAL, FUNCTIONALITY_RESTRICTED, FUNCTIONALITY_FOR_PROJECT_X,
  FORCE_32BIT = 0xFFFFFFFF };

FORCE_32BIT যোগ করে আমরা নিশ্চিত করেছিলাম যে Econant একটি দীর্ঘ সংকলন করেছে, সুতরাং এটি E এর সাথে বিনিময়যোগ্য able


1
অবশ্যই, এর অর্থ হ'ল (এ) ই এবং ইকনেন্টের ধরণের পার্থক্য রয়েছে এবং এলপি 64 সিস্টেমে (বি) আকারের (ই) = 2 * আকারের (ইসনেন্ট) tent তুচ্ছ ফিক্স: ULONG_MAX, পাশাপাশি পড়া সহজ।
এমসাল্টাররা ২

2

আপনি যদি সত্যিই চান না যে আপনার এনামটি আপনার শিরোনামের ফাইলে উপস্থিত হয় এবং নিশ্চিত হয়ে থাকে যে এটি কেবলমাত্র ব্যক্তিগত পদ্ধতি দ্বারা ব্যবহৃত হয়, তবে একটি সমাধান হতে পারে পিম্পল নীতির সাথে যেতে।

এটি এমন একটি কৌশল যা কেবলমাত্র ঘোষণার মাধ্যমে শিরোলেখগুলিতে শ্রেণীর ইন্টার্নালগুলি আড়াল করা নিশ্চিত করে:

class A 
{
public:
    ...
private:
    void* pImpl;
};

তারপরে আপনার বাস্তবায়ন ফাইলে (সিপিপি), আপনি এমন একটি ক্লাস ঘোষণা করেন যা অন্তর্বাসগুলির প্রতিনিধিত্ব করবে।

class AImpl
{
public:
    AImpl(A* pThis): m_pThis(pThis) {}

    ... all private methods here ...
private:
    A* m_pThis;
};

আপনার অবশ্যই শ্রেণি নির্মাতাতে গতিশীলভাবে বাস্তবায়ন তৈরি করতে হবে এবং এটি ডেস্ট্রাক্টরে মুছে ফেলতে হবে এবং সর্বজনীন পদ্ধতি প্রয়োগ করার সময় আপনাকে অবশ্যই এটি ব্যবহার করতে হবে:

((AImpl*)pImpl)->PrivateMethod();

পিম্পল ব্যবহারের পক্ষে অনেকগুলি দক্ষতা রয়েছে, একটি হ'ল এটি আপনার ক্লাস শিরোনামটিকে এর বাস্তবায়ন থেকে ডিক্লুপ করে দেয়, একটি শ্রেণি প্রয়োগ বাস্তবায়নের সময় অন্যান্য শ্রেণি পুনরায় সংকলনের প্রয়োজন হয় না। আর একটি হ'ল আপনার সংকলনের সময়ের গতি বাড়িয়েছে কারণ আপনার শিরোনামগুলি এত সহজ।

তবে এটি ব্যবহারে ব্যথা হচ্ছে, তাই আপনার নিজের জিজ্ঞাসা করা উচিত আপনার শিরোনামকে কেবল ব্যক্তিগত শিরোনাম হিসাবে ব্যক্তিগত হিসাবে ঘোষণা করা কি এতো সমস্যা।


3
কাঠাম এআইএমপিএল; স্ট্রাক এ {প্রাইভেট: এআইএমপিএল * পিআইএমপিএল; };

2

কিছু কনস্ট্রাক্টর এবং টাইপ রূপান্তর যুক্ত করে আপনি কাঠামোতে এনামটি মোড়ানো করতে পারেন এবং তার পরিবর্তে স্ট্রাক্টটি ঘোষণা করতে পারেন।

#define ENUM_CLASS(NAME, TYPE, VALUES...) \
struct NAME { \
    enum e { VALUES }; \
    explicit NAME(TYPE v) : val(v) {} \
    NAME(e v) : val(v) {} \
    operator e() const { return e(val); } \
    private:\
        TYPE val; \
}

এটি কাজ করে বলে মনে হচ্ছে: http://ideone.com/TYtP2


1

দেখে মনে হচ্ছে এটি জিসিসিতে ফরওয়ার্ড-ডিক্লেয়ার করা যাবে না!

আকর্ষণীয় আলোচনা এখানে


1

এটি বিস্ফোরিত হওয়ার পরে কিছুটা ভিন্নমত রয়েছে (সাজানো), সুতরাং এখানে মান থেকে কিছু প্রাসঙ্গিক বিট দেওয়া হয়েছে। গবেষণা দেখায় যে স্ট্যান্ডার্ডটি প্রকৃতপক্ষে ঘোষণা ঘোষণাকে সংজ্ঞায়িত করে না, বা এটি সুস্পষ্টভাবে জানায় না যে এনামগুলি ঘোষণা করা যায় না বা ঘোষণা করা যায় না।

প্রথমে, dcl.enum থেকে, বিভাগ 7.2:

একটি গণনার অন্তর্নিহিত ধরণ হল একটি অবিচ্ছেদ্য প্রকার যা গণনাতে সংজ্ঞায়িত সমস্ত গণকের মানকে উপস্থাপন করতে পারে। এটি রূপায়ণ-সংজ্ঞায়িত যা অন্তর্ভুক্ত টাইপ একটি গণনার জন্য অন্তর্নিহিত প্রকার হিসাবে ব্যবহৃত হয় তা বাদে অন্তর্নিহিত প্রকারটি ইন্টের চেয়ে বড় হবে না যদি না কোনও এনুম্যরেটারের মান কোনও ইন্ট বা স্বাক্ষরযুক্ত ইন্টিতে ফিট না করে। যদি গণনা-তালিকাটি খালি থাকে তবে অন্তর্নিহিত প্রকারটি হ'ল গণনাটির মান 0 সহ একটি একক গণক রয়েছে size আকারের () অন্তর্নিহিত প্রকারে প্রয়োগ করা হয়।

সুতরাং একটি এনামের অন্তর্নিহিত ধরণটি একটি ছোটখাটো বাধা সহ বাস্তবায়ন-সংজ্ঞায়িত।

এরপরে আমরা "অসম্পূর্ণ প্রকারগুলি" (৩.৯) -এ বিভাগে ফ্লিপ করব, যা আমরা সামনে ঘোষণার কোনও মানটিতে পৌঁছানোর মতোই কাছাকাছি:

এমন একটি শ্রেণি যা ঘোষিত হয়েছে তবে সংজ্ঞায়িত করা হয়নি, বা অজানা আকারের একটি উপাদান বা অসম্পূর্ণ উপাদান ধরণের, একটি অসম্পূর্ণভাবে সংজ্ঞায়িত অবজেক্টের ধরণ।

একটি শ্রেণির ধরণ (যেমন "দশম শ্রেণি") অনুবাদ ইউনিটে এক পর্যায়ে অসম্পূর্ণ হতে পারে এবং পরে সম্পূর্ণ হতে পারে; টাইপ "দশম শ্রেণি" উভয় পয়েন্টে একই ধরণের। অ্যারে অবজেক্টের ঘোষিত প্রকারটি অসম্পূর্ণ শ্রেণির ধরণের অ্যারে এবং তাই অসম্পূর্ণ হতে পারে; যদি অনুবাদ ইউনিটে পরে শ্রেণীর ধরণের কাজ শেষ হয় তবে অ্যারের ধরণটি সম্পূর্ণ হয়ে যায়; এই দুটি পয়েন্টে অ্যারে টাইপ একই ধরণের। অ্যারে অবজেক্টের ঘোষিত প্রকারটি অজানা আকারের অ্যারে হতে পারে এবং তাই অনুবাদ ইউনিটে এক পর্যায়ে অসম্পূর্ণ হতে পারে এবং পরে সম্পূর্ণ হয়; এই দুটি পয়েন্টে অ্যারের প্রকারগুলি ("T এর অজানা বাউন্ডের অ্যারে" এবং "এন টি এর অ্যারে") বিভিন্ন ধরণের। অজানা আকারের অ্যারেতে নির্দেশকের ধরণ, বা কোনও টাইপডেফ ঘোষণা দ্বারা অজানা আকারের অ্যারে হিসাবে নির্ধারিত,

সুতরাং সেখানে, স্ট্যান্ডার্ড বেশ অনেকগুলি প্রচ্ছন্নভাবে প্রবর্তিত হতে পারে forward এনুম সেখানে ছিল না, তাই সংকলক লেখকরা সাধারণত এর অন্তর্নিহিত ধরণের পরিবর্তিত আকারের কারণে মান দ্বারা অনুমোদিত হিসাবে অগ্রণী হিসাবে ঘোষণা হিসাবে বিবেচনা করে।

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


মনে রাখবেন যে এটি "enum foo" কে স্পষ্টভাবে অস্বীকার করে; 7.1.5.3/1 তে (তবে যতক্ষণ সংকলক সতর্ক করে, যতক্ষণ না এটি এখনও এই জাতীয় কোড অবশ্যই সংকলন করতে পারে)
জোহানেস স্কাউব - লিটব ২

এটি উল্লেখ করার জন্য ধন্যবাদ, এটি একটি সত্যই অনুচ্ছেদ এবং এটি পার্স করতে আমার এক সপ্তাহ সময় লাগতে পারে। তবে এটি সেখানে জানা ভাল।
ড্যান ওলসন

কোনও উদ্বেগ নেই ome কিছু স্ট্যান্ডার্ড অনুচ্ছেদ সত্যিই অদ্ভুত :) ভাল, একটি বিস্তৃত টাইপ স্পেসিফায়ার এমন একটি জিনিস যা আপনি কোনও প্রকার নির্দিষ্ট করে থাকেন, তবে এটিকে দ্ব্যর্থহীন করার জন্য আরও কিছু নির্দিষ্ট করে। উদাহরণস্বরূপ "এক্স" এর পরিবর্তে "স্ট্রাক্ট এক্স", বা কেবল "ওয়াই" এর পরিবর্তে "এনাম ওয়াই" y
জোহানেস স্কাউব -

সুতরাং আপনি এটির মতো এটি ব্যবহার করতে পারেন: "দশম শ্রেণি * foo;" যদি এক্স এখনও ঘোষণা করা হয় নি। বা অসম্পূর্ণতার জন্য একটি টেমপ্লেটে "টাইপনেম এক্স :: ফু"। বা "ক্লাস লিঙ্ক আপত্তি;" যদি একই সুযোগে কোনও ফাংশন "লিঙ্ক" থাকে যা একই নামে শ্রেণীর ছায়া নেবে।
জোহানেস স্কাউব - লিটব

৩.৪.৪-তে এটি বলে যে কিছু অ-টাইপ নামের কোনও প্রকারের নামটি গোপন রাখলে সেগুলি ব্যবহৃত হয়। তারা এখানে প্রায়শই ব্যবহৃত হয়, "দশম শ্রেণির মতো" ঘোষণা করা ছাড়াও (এখানে এটি একটি ঘোষণার একমাত্র গঠন)। এটি এখানে তাদের নন-টেম্পলেটগুলিতে আলোচনা করে। তবে, 14.6 / 3 টেমপ্লেটগুলিতে তাদের ব্যবহারের তালিকা করে lists
জোহানেস স্কাউব - লিটব

1

ভিসির জন্য, এখানে ফরওয়ার্ড ডিক্লেয়ারেশন এবং অন্তর্নিহিত ধরণের নির্দিষ্টকরণ সম্পর্কে পরীক্ষা করা হয়:

  1. নিম্নলিখিত কোড ঠিক আছে সংকলিত হয়।
    টাইপিড ইনট মাইনিট;
    এনাম টি;
    অকার্যকর foo (টি * টিপি)
    {
        * টিপি = (টি) 0x12345678;
    }
    এনাম টি: চর
    {
        একজন
    };

তবে / ডাব্লু 4 এর জন্য সতর্কতা পেয়েছে (/ ডাব্লু 3 এই সতর্কতাটি জড়িত নয়)

সতর্কতা C4480: নন-স্ট্যান্ডার্ড এক্সটেনশন ব্যবহৃত হয়েছে: এনাম 'টি' এর জন্য অন্তর্নিহিত ধরণ নির্দিষ্ট করে

  1. উপাচার্য (মাইক্রোসফ্ট (আর) 32-বিট সি / সি ++ 80x86 এর জন্য 15.00.30729.01 সংকলক সংস্করণ অনুকূলিত করা উপরের ক্ষেত্রে বগি দেখাচ্ছে:

    • এনাম টি দেখার সময়; ভিসি এনাম টাইপ টি অনুমান করে যে অন্তর্নিহিত টাইপ হিসাবে ডিফল্ট 4 বাইট ইনট ব্যবহার করে, তাই উত্পন্ন সমাবেশের কোডটি হ'ল:
    ? foo @@ YAXPAW4T @@@ Z PROC; foo বিন্যাস
    ; ফাইল ই: \ work \ c_cpp \ cpp_snippet.cpp
    ; লাইন 13
        ebp ধাক্কা
        Mov ebp, esp
    ; লাইন 14
        মুভ ইক্স, ডিওয়ার্ড পিটিআর _টিপি t [ইবিপি]
        মুভ ডিওয়ার্ড পিটিআর [ইক্স], 305419896; 12345678H
    ; লাইন 15
        পপ ebp
        ret 0
    ? foo @@ YAXPAW4T @@@ জেড এন্ডপি; foo বিন্যাস

উপরের অ্যাসেম্বলি কোডটি আমার / ব্যক্তিগতভাবে অনুমান না করে সরাসরি /First.asm থেকে বের করা হয়। আপনি কি মুভ ডিওয়ার্ড পিটিআর দেখতে পাচ্ছেন [eax], 305419896; 12345678H লাইন?

নিম্নলিখিত কোড স্নিপেট এটি প্রমাণ করে:

    ইন্ট মেইন (ইন্ট আরজিসি, চর * আরজিভি)
    {
        মিলন {
            চর সিএ [4];
            টি টি;
        } একটি;
        a.ca [0] = a.ca [1] = ক। [সিএ [2] = a.ca [3] = 1;
        foo (& a.t);
        প্রিন্টফ ("% # x,% # x,% # x,% # x \ n", a.ca [0], a.ca [1], a.ca [2], a.ca [3]) ;
        প্রত্যাবর্তন 0;
    }

ফলাফল: 0x78, 0x56, 0x34, 0x12

  • এনাম টি-র ফরওয়ার্ড ডিক্লেয়ারেশন মুছে ফেলার পরে এনাম টি এর সংজ্ঞার পরে ফাংশন ফু-র সংজ্ঞা সরিয়ে নিন: ফলাফলটি ঠিক আছে:

উপরের মূল নির্দেশিকাটি হয়ে যায়:

Mov BYTE PTR [eax], 120; 00000078H

চূড়ান্ত ফলাফল: 0x78, 0x1, 0x1, 0x1

নোটটি ওভাররাইট করা হচ্ছে না

সুতরাং ভিসিতে এনামের ফরওয়ার্ড-ডিক্লেয়ারেশন ব্যবহার ক্ষতিকারক হিসাবে বিবেচিত হয়।

বিটিডাব্লু, অবাক হওয়ার মতো বিষয় নয় যে অন্তর্নিহিত ধরণের ঘোষণার জন্য সিনট্যাক্সটি সি # তে রয়েছে। প্রাইসিসে আমি এমবেডেড সিস্টেমের সাথে কথা বলার সময় অন্তর্নিহিত ধরণের উল্লেখ করে 3 বাইট সংরক্ষণ করার উপযুক্ত বলে মনে করি যা স্মৃতি সীমাবদ্ধ।


1

আমার প্রকল্পগুলিতে, আমি উত্তরাধিকার এবং তৃতীয় পক্ষের উপাদানগুলির সাথে কাজ করার জন্য নেমস্পেস-বাউন্ড এনুমুরেশন কৌশল গ্রহণ করেছি enum। এখানে একটি উদাহরণ:

forward.h:

namespace type
{
    class legacy_type;
    typedef const legacy_type& type;
}

enum.h:

// May be defined here or pulled in via #include.
namespace legacy
{
    enum evil { x , y, z };
}


namespace type
{
    using legacy::evil;

    class legacy_type
    {
    public:
        legacy_type(evil e)
            : e_(e)
        {}

        operator evil() const
        {
            return e_;
        }

    private:
        evil e_;
    };
}

foo.h:

#include "forward.h"

class foo
{
public:
    void f(type::type t);
};

foo.cc:

#include "foo.h"

#include <iostream>
#include "enum.h"

void foo::f(type::type t)
{
    switch (t)
    {
        case legacy::x:
            std::cout << "x" << std::endl;
            break;
        case legacy::y:
            std::cout << "y" << std::endl;
            break;
        case legacy::z:
            std::cout << "z" << std::endl;
            break;
        default:
            std::cout << "default" << std::endl;
    }
}

main.cc:

#include "foo.h"
#include "enum.h"

int main()
{
    foo fu;
    fu.f(legacy::x);

    return 0;
}

নোট করুন যে foo.hশিরোনাম সম্পর্কে কিছু জানার দরকার নেই legacy::evil। উত্তরাধিকার প্রকারটি legacy::evil(কেবল এখানে: main.cc) ব্যবহার করা ফাইলগুলিকে অন্তর্ভুক্ত করা দরকার enum.h


0

আপনার সমস্যার সমাধান আমার সমাধান হয়:

1 - এনামগুলির পরিবর্তে int ব্যবহার করুন: আপনার সিপিপি ফাইলের একটি অনামী নেমস্পেসে আপনার ইনটগুলি ঘোষণা করুন (শিরোনামে নয়):

namespace
{
   const int FUNCTIONALITY_NORMAL = 0 ;
   const int FUNCTIONALITY_RESTRICTED = 1 ;
   const int FUNCTIONALITY_FOR_PROJECT_X = 2 ;
}

আপনার পদ্ধতিগুলি ব্যক্তিগত হিসাবে, কেউই ডেটা নিয়ে গন্ডগোল করবে না। এমনকি যদি কেউ আপনাকে একটি অবৈধ ডেটা প্রেরণ করে তবে আপনি পরীক্ষা করতে আরও যেতে পারেন:

namespace
{
   const int FUNCTIONALITY_begin = 0 ;
   const int FUNCTIONALITY_NORMAL = 0 ;
   const int FUNCTIONALITY_RESTRICTED = 1 ;
   const int FUNCTIONALITY_FOR_PROJECT_X = 2 ;
   const int FUNCTIONALITY_end = 3 ;

   bool isFunctionalityCorrect(int i)
   {
      return (i >= FUNCTIONALITY_begin) && (i < FUNCTIONALITY_end) ;
   }
}

2: জাভাতে করা মতো সীমাবদ্ধ কনস্ট্যান্টেশন সহ একটি পূর্ণাঙ্গ শ্রেণি তৈরি করুন। ফরোয়ার্ড ক্লাসটি ডিক্লেয়ার করুন, এবং তারপরে এটি সিপিপি ফাইলে সংজ্ঞায়িত করুন এবং কেবল এনাম-জাতীয় মানগুলি ইনস্ট্যান্ট করুন। আমি সি ++ তে এর মতো কিছু করেছি এবং ফলাফলটি পছন্দসই হিসাবে ততটা সন্তোষজনক ছিল না, কারণ এনাম (অনুলিপি নির্মাণ, অপারেটর = ইত্যাদি) অনুকরণ করতে এর জন্য কিছু কোড প্রয়োজন।

3: পূর্বে প্রস্তাবিত হিসাবে, ব্যক্তিগতভাবে ঘোষিত এনাম ব্যবহার করুন। কোনও ব্যবহারকারী এর পূর্ণ সংজ্ঞা দেখতে পাবে তা সত্ত্বেও, এটি এটি ব্যবহার করতে সক্ষম হবে না, বা ব্যক্তিগত পদ্ধতিগুলি ব্যবহার করতে পারবে না। সুতরাং আপনি সাধারণত আপনার ক্লাসটি ব্যবহার করে কোড পুনরায় সংকলনের প্রয়োজন ছাড়াই এনাম এবং বিদ্যমান পদ্ধতির সামগ্রীটি সংশোধন করতে সক্ষম হবেন।

আমার অনুমান হয় সমাধান 3 বা 1 হয়।


-1

যেহেতু এনাম বিভিন্ন আকারের একটি অবিচ্ছেদ্য আকার হতে পারে (সংকলক একটি প্রদত্ত এনামের আকারের আকারটি নির্ধারণ করে) এনামের পয়েন্টারটিতেও বিভিন্ন আকার থাকতে পারে, যেহেতু এটি একটি অবিচ্ছেদ্য প্রকার (চরগুলি কিছু প্ল্যাটফর্মে পৃথক আকারের পয়েন্টার থাকে) এই ক্ষেত্রে).

সুতরাং সংকলক এমনকি এনাম এবং ব্যবহারকারীকে এটির জন্য একটি পয়েন্টার ফরোয়ার্ড-ঘোষণা করতে দেয় না, কারণ এমনকি সেখানে, এটি এনামের আকার প্রয়োজন।


-1

প্রকারের উপাদানগুলির সম্ভাব্য মানগুলিকে সীমিত সংখ্যায় সীমাবদ্ধ করতে আপনি একটি গণনা সংজ্ঞায়িত করেন। সংকলনের সময় এই সীমাবদ্ধতা প্রয়োগ করা উচিত।

আপনি যখন পরে 'সীমিত সেট' ব্যবহার করবেন এই সত্যটি ঘোষণার সময় কোনও মান যুক্ত হয় না: পরবর্তী কোডটি এটি থেকে উপকৃত হওয়ার জন্য সম্ভাব্য মানগুলি জানতে হবে।

যদিও কম্পাইলার হয় গণিত টাইপ মাপ সম্পর্কে উদ্বিগ্ন, অভিপ্রায় শুমার হারানো পরার যখন আপনি এটি ফরওয়ার্ড ঘোষণা।


1
না, পরবর্তী কোডগুলি এর কার্যকর হওয়ার জন্য মানগুলি জানা উচিত নয় - বিশেষত, যদি পরবর্তী কোডগুলি কেবল এনাম প্যারামিটারগুলি গ্রহণ বা ফিরিয়ে ফাংশন প্রোটোটাইপ হয় তবে টাইপের আকারটি গুরুত্বপূর্ণ নয়। এখানে ফরওয়ার্ড ডিক্লেয়ারেশন ব্যবহার করে বিল্ড নির্ভরতা, দ্রুতগতির সংকলন মুছে ফেলতে পারে।
j_random_hacker 26'09

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