সি তে এনামের আকার কত?


140

আমি এনাম মানগুলির একটি সেট তৈরি করছি, তবে প্রতিটি এনাম মান 64৪ বিট প্রশস্ত হতে হবে। যদি আমি সঠিকভাবে স্মরণ করি তবে একটি এনাম সাধারণত একটি ইন্টের সমান আকার হয়; তবে আমি ভেবেছিলাম আমি কোথাও পড়েছি যে (কমপক্ষে জিসিসিতে) সংকলক এনামকে তাদের মানগুলি রাখার জন্য যে প্রস্থের প্রয়োজন সেগুলি তৈরি করতে পারে। সুতরাং, 64 বিট প্রস্থের এনাম থাকা কি সম্ভব?


1
সুতরাং যদি আমি ভালভাবে বুঝতে পারি, 2 ^ 32 এনামগুলি আপনার পক্ষে যথেষ্ট নয়? বা এটি একটি অ্যালগিনমেন্টের উদ্বেগ, আপনার কেন 32 বছরের পরিবর্তে 64 হওয়া দরকার, আমি খুব কৌতূহলী।
জোকুন

1
@ জোকুন: আমি সত্যই আর মনে রাখি না। আমি মনে করি যে আমি এনামগুলিতে 2 ^ 32-1 এর চেয়ে বড় মানের ধারণ করতে চেয়েছিলাম।
মিপাদি

আপনার যদি এনাম এবং পয়েন্টারের মধ্যে ইউনিয়ন প্রয়োজন হয় তবে তার একটি ব্যবহার।
ডেমি

উত্তর:


97

একটি enumকেবল intমানগুলি ধরে রাখার পক্ষে যথেষ্ট পরিমাণে গ্যারান্টিযুক্ত । সংজ্ঞায়িত সংখ্যার উপর ভিত্তি করে ব্যবহৃত প্রকৃত প্রকারটি সংকলক নির্ধারণ করতে নিখুঁত তাই এটি যদি আপনার সংজ্ঞায়িত মানগুলিকে উপস্থাপন করতে পারে তবে এটি একটি ছোট প্রকার চয়ন করতে পারে। আপনার যদি এমন গণনার ধ্রুবকগুলির প্রয়োজন হয় যা এটির সাথে খাপ খায় না তবে এটি intকরার জন্য আপনাকে সংকলক-নির্দিষ্ট এক্সটেনশনগুলি ব্যবহার করতে হবে।


12
আপনার প্রথম বাক্যটি আপনার শেষের সাথে বিরোধী বলে মনে হচ্ছে। বাধ্যতা যে কি enumএকটি চেয়ে বেশি হওয়া উচিত intবা ছোট? @ মিশেলস্টামের উত্তর অনুসরণ করে আপনার প্রথম বাক্যটি হওয়া উচিত "একটি enumকেবলমাত্র একটি intমানের সাথে মানানসই গ্যারান্টিযুক্ত ।"
হাস্কেলএলেফ্যান্ট

দু'টি পরিপূরক প্ল্যাটফর্মগুলিতে একটি কুৎসিত বাস্তবায়ন সংবেদনশীল হ্যাক হিসাবে (এটি কি এই দিনগুলিতে সমস্ত সিস্টেম?), আপনি কোনও এনামকে নেতিবাচক মান রয়েছে তা নিশ্চিত করে কোনও প্রকারের মতো বৃহত্তর হতে বাধ্য করতে পারেন। যদিও প্রস্তাবিত কৌশল নয়।
বিদ্রুপ

7
এই উত্তরটি মনে হয় যে একটি এনাম একটি হিসাবে বৃহত্তর intমাইকেল স্টামের উত্তর , যা সি 99 উল্লেখ করেছে, বলছে যে একটি এনাম একটি হিসাবে ছোট হতে পারে char
ফ্রাঙ্ক কুষ্টার্স

3
এই উত্তরের প্রথম বাক্যটি ভুল। enumশুধুমাত্র বৃহৎ যথেষ্ট enum সর্ববৃহৎ গণনাকারী এর মূল্য রাখা হতে নিশ্চিত করা হয়।
এমএম

91

বর্তমান সি স্ট্যান্ডার্ড (সি 99) থেকে নেওয়া: http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf

6.7.2.2 এনুমারেশন নির্দিষ্টকরী
[...]
সীমাবদ্ধতাসমূহ
অভিব্যক্তি যে শুমার ধ্রুবক এর মান সংজ্ঞায়িত কোন int হিসাবে একটি মান representable আছে একটি পূর্ণসংখ্যা ধ্রুবক অভিব্যক্তি হইবে।
[...]
প্রতিটি গণনা করা টাইপ চর, স্বাক্ষরিত পূর্ণসংখ্যার ধরণ বা স্বাক্ষরবিহীন পূর্ণসংখ্যার ধরণের সাথে সামঞ্জস্যপূর্ণ। ধরণের পছন্দটি বাস্তবায়ন-সংজ্ঞায়িত, তবে গণনার সমস্ত সদস্যের মান উপস্থাপন করতে সক্ষম হবে।

সংকলকগণ মান অনুসরণ করতে কোনও ভাল নয়, তবে মূলত: আপনার এনাম যদি কোনও ইনট ব্যতীত অন্য কিছু ধারণ করে তবে আপনি গভীর "অসমর্থিত আচরণে আছেন যা আপনাকে এক বা দুই বছর" অঞ্চলে কামড় দিয়ে ফিরে আসতে পারে।


3
কেবলমাত্র এটিই রয়েছে, নিম্নলিখিতগুলি কার্যকর বলে আমি মনে করি: এনাম {LAST = INT_MAX, LAST1, LAST2}; সুতরাং LAST2 ইনট হিসাবে উপস্থাপনযোগ্য নয়, তবে এটি সংজ্ঞায়িত করার মত প্রকাশ ছিল না।
জোহানেস স্কাউব -

4
প্রকৃত পিডিএফ এ এটি সংজ্ঞায়িত করেছে: "একটি এনালিওরেটর তালিকার শনাক্তকারীদের ধ্রুবক হিসাবে ঘোষণা করা হয় যা টাইপ ইন্ট [...] রয়েছে" " এটিকে খুব ভার্জোজ না করার জন্য আমি বাদ দিয়েছি।
মাইকেল স্টাম

2
নোট " একটি স্বাক্ষরিত পূর্ণসংখ্যা প্রকার, বা একটি স্বাক্ষরবিহীন পূর্ণসংখ্যা টাইপ"। অগত্যা intshortএবং longধরনের পূর্ণসংখ্যা খুব হয়, এবং যাই হোক না কেন বাস্তবায়ন অকার্যকর, সব মান মাপসই ( "আবশ্যক হইবে শুমার সকল সদস্যদের মান প্রতিনিধিত্বমূলক সক্ষম হতে")।

3
উল্লেখযোগ্য: গণনা ধ্রুবক এবং গণনা করা টাইপ একই জিনিস নয় । পূর্ববর্তীগুলি এনাম ঘোষণার তালিকার বিষয়বস্তু, পরবর্তীটি প্রকৃত পরিবর্তনশীল। সুতরাং যখন গণনার ধ্রুবক অবশ্যই হবে int, প্রকৃত গণনা পরিবর্তনশীল অন্য ধরণের হতে পারে। এটি স্ট্যান্ডার্ডের একটি সুপরিচিত অসঙ্গতি।
লন্ডিন

1
Lundin এর বিন্দু নির্মল করতে: জন্য enum my_enum { my_value }, my_valueটাইপ থাকবে int, কিন্তু enum my_enumএকটি বাস্তবায়ন সংজ্ঞায়িত টাইপ যা কমপক্ষে সব শুমার মান প্রতিনিধিত্ব আবশ্যক থাকতে পারে। সুতরাং এতে my_valueসংকীর্ণ রূপান্তর থাকতে পারে enum my_enumতবে এটি উপচে না যাওয়ার গ্যারান্টিযুক্ত।
পি ও'কনভূই

17

পূর্ববর্তী উত্তরগুলি সঠিক হলেও, কয়েকটি সংকলকের কাছে স্ট্যান্ডার্ডটি ভেঙে দেওয়ার জন্য এবং ক্ষুদ্রতম ধরণের ব্যবহারের বিকল্প রয়েছে যাতে সমস্ত মান থাকবে।

জিসিসির সাথে উদাহরণ ( জিসিসি ম্যানুয়ালে ডকুমেন্টেশন ):

enum ord {
    FIRST = 1,
    SECOND,
    THIRD
} __attribute__ ((__packed__));
STATIC_ASSERT( sizeof(enum ord) == 1 )

11
আসলে, আমি যতদূর দেখতে পাচ্ছি এটি মানকে ভঙ্গ করে না। মাইকেল স্টামের উত্তরে যেমন ব্যাখ্যা করা হয়েছে, মানটি সংকলককে যতক্ষণ না সমস্ত মান মানিয়ে যায় ততক্ষণ এনামগুলির প্রকৃত প্রকারটি চয়ন করতে দেয়।
sleske

2
আমি ম্যাকোস সি ++ সংকলকগুলির সাথে কাজ করেছি যা তাদের এনামে ছোট আকারে সংরক্ষণের জন্য সীমিত মানের মান ব্যবহার করে। এটি মেট্রোওয়ারকস কোডওয়ারিওর বা এক্সকোড কিনা মনে করতে পারে না। এটি সি ++ স্ট্যান্ডার্ডের মধ্যে। আপনি সাধারণভাবে মাইজ (মাইনেম) == আকারের (ইনট) ধরে নিতে পারবেন না।
বিদ্রুপ

0

এনামের সর্বশেষ মানটি এত বড় একটি মান হিসাবে সেট করুন যাতে আপনি এনামটি আকার পছন্দ করতে চান তবে এটি সেই আকার হওয়া উচিত:

enum value{a=0,b,c,d,e,f,g,h,i,j,l,m,n,last=0xFFFFFFFFFFFFFFFF};

1
যদিও এই কোডটি প্রশ্নের উত্তর দিতে পারে, কীভাবে এবং / বা কেন এটি সমস্যার সমাধান করে তা সম্পর্কিত অতিরিক্ত প্রসঙ্গ সরবরাহ করলে উত্তরের দীর্ঘমেয়াদী মান উন্নত হবে।
লিওপাল

-1

enumভেরিয়েবলের আকারের উপর আমাদের কোনও নিয়ন্ত্রণ নেই । এটি সম্পূর্ণরূপে বাস্তবায়নের উপর নির্ভর করে এবং সংকলকটি ব্যবহার করে কোনও পূর্ণসংখ্যার জন্য একটি নাম সংরক্ষণ করার বিকল্প দেয় enum, সুতরাং enumকোনও পূর্ণসংখ্যার আকার অনুসরণ করে।


-1

সি ভাষায়, একটি enumএর আকারের গ্যারান্টিযুক্ত int-fshort-enumsএটি সংক্ষিপ্ত করার জন্য একটি সংকলন সময় বিকল্প ( ) রয়েছে (মানগুলি যদি 64৪ কেজের বেশি না হয় তবে এটি মূলত কার্যকর)। এর আকার 64৪ বিটে বাড়ানোর জন্য কোনও সংকলনের সময় বিকল্প নেই।


-6

এই কোডটি বিবেচনা করুন:

enum value{a,b,c,d,e,f,g,h,i,j,l,m,n};
value s;
cout << sizeof(s) << endl;

এটি আউটপুট হিসাবে 4 দেবে। সুতরাং কোনও উপাদানগুলির সংখ্যার বিষয়টি বিবেচনা না করেই enumএর আকার সর্বদা স্থির থাকে।


6
মাইকেল স্টামের উত্তরটি সঠিক। এটি সংকলক নির্দিষ্ট। আইআর ইওয়ারম দিয়ে আপনি নিজে চেষ্টা করে দেখতে পারেন। আইএআর ইওয়ারম আপনার উদাহরণের জন্য 1 দেখায়। যদি 255 আইটেম আপ হয় এটি এখনও 1. দেখায় 256th আইটেমটি যোগ পরে 2 যাও যায়
desowin

11
প্রশ্নটি সি ++ নিয়ে নয়।
মিখাস

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