আপনি যখন সি ++ এ এনাম ঘোষণার সময় টাইপেডেফ ব্যবহার করেন কেন?


183

আমি বছরগুলিতে কোনও সি ++ লিখিনি এবং এখন আমি এটিতে ফিরে আসার চেষ্টা করছি। আমি তখন এটি পেরিয়ে দিতাম এবং ছেড়ে দেওয়ার কথা ভেবেছিলাম:

typedef enum TokenType
{
    blah1   = 0x00000000,
    blah2   = 0X01000000,
    blah3   = 0X02000000
} TokenType;

এটা কি? কেন typedefশব্দ এখানে ব্যবহৃত? TokenTypeএই ঘোষণায় নামটি কেন দু'বার প্রদর্শিত হবে? শব্দার্থবিজ্ঞানগুলি এর থেকে আলাদা কীভাবে:

enum TokenType
{
    blah1 = 0x00000000,
    blah2=0x01000000,
    blah3=0x02000000
};

উত্তর:


156

সি-তে, আপনার এনামকে প্রথম উপায়ে ঘোষণা করার ফলে আপনি এটির মতো ব্যবহার করতে পারবেন:

TokenType my_type;

আপনি যদি দ্বিতীয় স্টাইল ব্যবহার করেন তবে আপনাকে আপনার ভেরিয়েবলটি এভাবে ঘোষণা করতে বাধ্য করা হবে:

enum TokenType my_type;

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


12
আপনার প্রশ্নটি কেবল সি এর জন্য সঠিক, তবে সি ++ নয়। সি ++ তে এনাম এবং স্ট্রাক্টগুলি সরাসরি ব্যবহার করা যেতে পারে যেন কোনও টাইপডেফ ছিল।
ডেভিড রদ্রিগেজ -

7
আচ্ছা, হ্যাঁ তবে এটি এমন সত্যিকারের প্রশ্নের উত্তর দেয় যা জিজ্ঞাসা করা হয়েছিল যা "এটি এমনকি কী বোঝায়?"
ববিশ্যাফটো

তাহলে কি এই প্রযুক্তিগতভাবে টাইপেইফ বা এনাম?
মাইক

5
এটা উভয়। আপনি আরও বলতে পারেন: এনোকন টোকেনটাইপ_ {...}; টাইপেফ এনাম টোকেনটাইপ_ টোকেনটাইপ;
রায়ান ফক্স

উত্তরটি সম্পূর্ণ, তবে আমি বিশ্বাস করি যে বিষয়টি হ'ল টোকেনটাইপ; এনাম ঘোষণার পরে প্রকারের নামটি কী তা ঘোষণা করা হয়। সুতরাং উত্তরটি 100% সম্পূর্ণ নয় 'প্রথম উপায়ে' ঘোষণার জন্য একটি এনাম এবং একটি নতুন টাইপনেম নির্দিষ্ট করে যা সিনট্যাক্সের এক ব্লাবে থাকে। উত্তরটি সহায়ক ছিল, তবে আমি ভাবছি কিছুটা উন্নতি হতে পারে। আমি ভোট কমাতে খুব কঠোর ছিলাম। সুতরাং আমি এটি সব পরে upvated। আমি যদি সত্যিই নিজেকে নিশ্চিত করে থাকি তবে আমি উত্তর সম্পাদনা / উন্নতি করতে গিয়ে স্বাচ্ছন্দ্য বোধ করতাম ... তবে এটি বেশ ভাল উত্তর
রস ইয়ংব্লুড

97

এটি সি এর একটি heritageতিহ্য, যদি আপনি এটি করেন:

enum TokenType
{
    blah1   = 0x00000000,
    blah2   = 0X01000000,
    blah3   = 0X02000000
};

আপনাকে এ জাতীয় কিছু ব্যবহার করতে হবে:

enum TokenType foo;

তবে আপনি যদি এটি করেন:

typedef enum e_TokenType
{
    blah1   = 0x00000000,
    blah2   = 0X01000000,
    blah3   = 0X02000000
} TokenType;

আপনি ঘোষণা করতে সক্ষম হবেন:

TokenType foo;

তবে সি ++ এ আপনি কেবল পূর্বের সংজ্ঞাটি ব্যবহার করতে পারেন এবং এটি ব্যবহার করতে পারেন যেমন এটি কোনও সি টাইপেডে রয়েছে।


1
আপনি যা বলছেন তা সি। এ সত্য C
জোনাথন লেফলার

49
আমি আমার শেষ বাক্যে যা বলেছি তাই না?
মাদুর

2
@ ম্যাট আমি সর্বশেষ বাক্যটি সম্পর্কে আপনার মন্তব্যকে উস্কে দিয়েছি, তবে ন্যায্য বলতে এটি দুর্বল শব্দযুক্ত এবং বিভ্রান্তিকর।
এআর

20

আপনার এটি করার দরকার নেই। সি-তে (সি ++ নয়) আপনাকে গণনা করা টাইপের একটি ডাটা উপাদান উল্লেখ করতে এনাম এনামনাম ব্যবহার করতে হবে। এটা প্রক্রিয়া সহজ করার জন্য আপনাকে অনুমতি দেওয়া হয়েছে typedef একটি একক নাম ডাটা টাইপ তা।

typedef enum MyEnum { 
  //...
} MyEnum;

এনামের একটি প্যারামিটার গ্রহণকারী ফাংশনগুলি হিসাবে সংজ্ঞায়িত করা যায়

void f( MyEnum x )

পরিবর্তে দীর্ঘ

void f( enum MyEnum x )

নোট করুন যে টাইপনেমের নাম এনামের নামের সাথে সমান হওয়া দরকার নেই। একই স্ট্রাক্ট সঙ্গে ঘটে।

অন্যদিকে, সি ++ এ এটির প্রয়োজন হয় না, কারণ এনাম, ক্লাস এবং স্ট্রাক্টগুলি সরাসরি তাদের নাম অনুসারে ব্যবহার করা যেতে পারে।

// C++
enum MyEnum {
   // ...
};
void f( MyEnum x ); // Correct C++, Error in C

আসলে আমি মনে করি এটি সাধারণত গৃহীত উত্তরগুলির চেয়ে উত্তম উত্তর হতে পারে কারণ এটি স্পষ্টভাবে "কেন" আলাদাভাবে ব্যাখ্যা করে।
রস ইয়ংব্লুড

11

সি-তে এটি স্টাইলটি ভাল কারণ আপনি প্রকারটি এনামের পাশাপাশি কিছুতেও পরিবর্তন করতে পারেন।

typedef enum e_TokenType
{
    blah1   = 0x00000000,
    blah2   = 0X01000000,
    blah3   = 0X02000000
} TokenType;

foo(enum e_TokenType token);  /* this can only be passed as an enum */

foo(TokenType token); /* TokenType can be defined to something else later
                         without changing this declaration */

সি ++ এ আপনি এনামকে সংজ্ঞায়িত করতে পারেন যাতে এটি সি ++ বা সি হিসাবে সংকলিত হয় will


বলতে In C++ you can *typedef* the enum so that it will compile as C++ or C.চাও না ? আপনি বলেছিলেন: In C++ you can define the enum so that it will compile as C++ or C.লক্ষ্য করুন কিভাবে আমি তোমার পরিবর্তিত defineকরতে typedef। আচ্ছা ... আমি অনুমান typedefing হয় সংজ্ঞায়িত।
গ্যাব্রিয়েল স্ট্যাপলস

6

সি থেকে হোল্ডওভার


ডান্নো যে 'প্রাথমিক' যোগ্যতাটি প্রাসঙ্গিক; আপনি তখনও সিতে লিখতে পারেন যদি আপনি এনাম প্রিফিক্স ছাড়াই টাইপের নামটি ব্যবহার করতে চান।
জোনাথন লেফলার

1
সত্য। আমি এটি মুছে ফেলব। আমি দীর্ঘদিন ধরে সি স্পেক অনুসরণ করিনি। আমি আমার জন্য সি / সি ++ পার্থক্য ... -1 পরীক্ষা করতে খুব অলস হয়েছি।
টিম

6

কিছু লোক বলেন সি এর নেমস্পেস নেই তবে এটি প্রযুক্তিগতভাবে সঠিক নয়। এটিতে তিনটি রয়েছে:

  1. ট্যাগস ( enum, unionএবং struct)
  2. লেবেল
  3. (অন্য সব কিছুর)

typedef enum { } XYZ;একটি বেনামে গণনা ঘোষণা করে এবং নাম সহ এটি বিশ্বব্যাপী নেমস্পেসে আমদানি করে XYZ

typedef enum ABC { } XYZ;ABCট্যাগ নেমস্পেসে নামের একটি এনাম ঘোষণা করে , তারপর এটি বিশ্বব্যাপী নেমস্পেসে আমদানি করে XYZ

কিছু লোক পৃথক নেমস্পেসগুলি নিয়ে বিরক্ত করতে চান না যাতে তারা সমস্ত কিছু টাইপ করে। অন্যরা কখনও টাইপেইফ করেন না কারণ তারা নাম স্পেসিং চান।


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

3

এটি একপ্রকার পুরানো, তবে যাইহোক, আমি আশা করি যে এই বছরের শুরুতে আমি যখন এটির সামনে এসেছিলাম তখন আমি যে লিঙ্কটি টাইপ করতে চলেছি সেটির প্রশংসা করব।

এখানে এটা । আমার যখন এমন কিছু বাজে টাইপডেফগুলি ধরতে হয় তখন আমার কাছে যে ব্যাখ্যাটি সর্বদা মনে থাকে তা উদ্ধৃত করা উচিত:

পরিবর্তনশীল ঘোষণাপত্রে, প্রবর্তিত নামগুলি সংশ্লিষ্ট প্রকারের উদাহরণ। [...] যাইহোক, typedefকীওয়ার্ডটি ঘোষণার আগে, প্রবর্তিত নামগুলি সম্পর্কিত ধরণের উপাধি হয়

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


1

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


1

"কেন" প্রশ্নের প্রকৃত উত্তর (যা এই পুরানো প্রশ্নের শীর্ষে বিদ্যমান উত্তরগুলি দ্বারা অবাক করে দেওয়া হয়) হ'ল এই enumঘোষণাটি সম্ভবত একটি শিরোনাম ফাইলে অবস্থিত যা সি এবং সি ++ কোড উভয়ই ক্রস-সংকলন করার উদ্দেশ্যে করা হয়েছে (যেমন, উভয় সি এবং সি ++ বাস্তবায়ন ফিউলস অন্তর্ভুক্ত)। এই জাতীয় শিরোনামের ফাইলগুলি লেখার শিল্পটি উভয় ভাষায় যথাযথ সামঞ্জস্যপূর্ণ অর্থ রয়েছে এমন ভাষা বৈশিষ্ট্যগুলি নির্বাচন করতে লেখকের দক্ষতার উপর নির্ভর করে।

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