সি তে একটি গণিত প্রকার (এনাম) কীভাবে সংজ্ঞায়িত করবেন?


272

আমি নিশ্চিত নই যে সি এনামগুলি ব্যবহারের জন্য উপযুক্ত বাক্য গঠন কী। আমার কাছে নিম্নলিখিত কোড রয়েছে:

enum {RANDOM, IMMEDIATE, SEARCH} strategy;
strategy = IMMEDIATE;

তবে এটি নিম্নলিখিত ত্রুটির সাথে সংকলন করে না:

error: conflicting types for strategy
error: previous declaration of strategy was here

আমি কি ভুল করছি?


7
বহু বছরের পুরনো প্রশ্ন, সম্ভবত কেউ এটিকে দেখবে না; তবে কেন এটি ত্রুটি দিচ্ছে? এটি আমার জ্ঞান হিসাবে যতদূর প্রশ্নে আসে ঠিক তেমন কাজ করা উচিত।
উত্কান গেজার

2
@ সোলভার এই সিনট্যাক্সটি ভুল কেন?
MCG

6
@ এমসিকিউ, নেক্রো ডিগ্রী নেক্রো: প্রশ্নটিতে উপস্থাপন করা বাক্য গঠনটি সি-তে ভুল নয়,strategy এটি একটি বেনামে গণনা করা টাইপ হিসাবে ঘোষণা করে এবং এই ধরণের ঘোষিত মানগুলির একটি নির্ধারণ করে। তদুপরি, যদি আমি অন্য কোনও তুচ্ছ main()ফাংশনে উপস্থাপিত কোডটি আবদ্ধ করি তবে এটি জিসিসি ৪.৪. with সহ কোনও সতর্কতা ছাড়াই আমার জন্য জরিমানা সংকলন করে। কিছু প্রশ্নের উত্তর একইরকম বোঝায়, যদিও এত কথায় নয়।
জন বলিঞ্জার

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

3
@ সলভার: enum strategy { ... };নামের একটি অঙ্কিত প্রকারের সংজ্ঞা দেয়, ট্যাগটি enum strategyকোথায় strategyenum { ... } strategy;একটি বেনামে গণনা করা টাইপ (ট্যাগ নেই) এবং সেই ধরণের একটি একক অবজেক্টের সংজ্ঞা দেয় strategy। উভয়ই পুরোপুরি আইনী; তারা শুধু বিভিন্ন জিনিস বোঝায়।
কিথ থমসন

উত্তর:


377

একটি এনাম ভেরিয়েবল ঘোষণা করা এইভাবে করা হয়:

enum strategy {RANDOM, IMMEDIATE, SEARCH};
enum strategy my_strategy = IMMEDIATE;

তবে আপনি typedefভেরিয়েবলের ঘোষণাগুলি সংক্ষিপ্ত করতে একটি ব্যবহার করতে পারেন :

typedef enum {RANDOM, IMMEDIATE, SEARCH} strategy;
strategy my_strategy = IMMEDIATE;

প্রকার এবং ভেরিয়েবলের মধ্যে পার্থক্য করার জন্য একটি নামকরণ কনভেনশন রাখা ভাল ধারণা:

typedef enum {RANDOM, IMMEDIATE, SEARCH} strategy_type;
strategy_type my_strategy = IMMEDIATE;

1
তবে ওপি একটি বেনামে
এনাম

আমি কেবল টাইপ করতে পারিনি enum MyEnum {} myVar;এবং তারপরে নীচের মত চলকটি ব্যবহার করতে পারি myVar:myVar = SOMEENUMCONSTANT;
মুশি

451

এটি আপনার কাছে দরকার নেই তা উল্লেখ করার মতো typedef। আপনি কেবল নীচের মত এটি করতে পারেন

enum strategy { RANDOM, IMMEDIATE, SEARCH };
enum strategy my_strategy = IMMEDIATE;

আপনি পছন্দ করেন কিনা এটি একটি স্টাইলের প্রশ্ন typedef। এটি ছাড়াই, আপনি যদি গণনার প্রকারটি উল্লেখ করতে চান তবে আপনাকে ব্যবহার করা দরকার enum strategy। এটি দিয়ে, আপনি কেবল বলতে পারেন strategy

উভয় উপায়ে তাদের প্রো এবং কনস রয়েছে। একটি আরও শব্দযুক্ত, তবে টাইপ শনাক্তকারীদের ট্যাগ-নামস্থানে রাখে যেখানে তারা সাধারণ সনাক্তকারীদের সাথে (যেমন ভাবেন struct statএবং statফাংশন: এগুলি কোনও বিরোধে নয়) নিয়ে বিরোধ করবে না এবং যেখানে আপনি তাত্ক্ষণিক দেখবেন যে এটি একটি প্রকার। অন্যটি সংক্ষিপ্ত, তবে সাধারণ নাম স্থানটিতে প্রকার শনাক্তকারীদের নিয়ে আসে।


6
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত নয় কারণ এটি ভুল। আপনি এনাম কৌশলটি ব্যবহার করতে পারবেন না {...}; সি তে - আপনি যদিও এটি সি ++ এ করতে এবং করতে পারেন।
ক্লিয়ারার

19
@ ক্লিয়ারার: ​​এই কোডটি নিখুঁতভাবে কাজ করে। এখানে একটি কার্যকারী উদাহরণ রয়েছে: আদর্শ one.com/T0YV17 নোট করুন যে এটি enumউভয় লাইনে কীওয়ার্ডটি ব্যবহার করে ।
রিচিহিন্ডল

বা "টাইপয়েড এনাম কৌশল {র‌্যান্ডম, তাত্ক্ষণিক, অনুসন্ধান, কৌশল t কৌশল_t;" এবং এনাম ব্যবহার করে দেব তারা যে কোনও কনভেনশন চায় তা ব্যবহার করতে পারে।
অ্যান্ডি নুগেন্ট

এটি দুর্দান্ত কাজ করে: enum strategy { RANDOM, IMMEDIATE, SEARCH }; তারপরে আপনি যখন সেই এনামের একটি উদাহরণ চান: `এনাম কৌশল মাইএনম;
ব্যবহারকারী 362929249

2
@AndyNugent এটি করবেন না! * _t ধরনের POSIX সংরক্ষিত
osvein

58

আপনি strategyদু'বার ঘোষণা করার চেষ্টা করছেন এবং সে কারণেই আপনি উপরের ত্রুটিটি পেয়ে যাচ্ছেন। নিম্নলিখিত কোনও অভিযোগ ছাড়াই কাজ করে (সংকলিত gcc -ansi -pendantic -Wall):

#include <stdio.h>

enum { RANDOM, IMMEDIATE, SEARCH } strategy = IMMEDIATE;

int main(int argc, char** argv){
    printf("strategy: %d\n", strategy);

    return 0;
}

উপরের পরিবর্তে, দ্বিতীয় লাইনটি এতে পরিবর্তন করা হয়েছিল:

...
enum { RANDOM, IMMEDIATE, SEARCH } strategy;
strategy = IMMEDIATE;
...

সতর্কতা থেকে আপনি নিজের ভুলটি সহজেই দেখতে পেলেন:

enums.c:5:1: warning: data definition has no type or storage class [enabled by default]
enums.c:5:1: warning: type defaults to int in declaration of strategy [-Wimplicit-int]
enums.c:5:1: error: conflicting types for strategy
enums.c:4:36: note: previous declaration of strategy was here

সুতরাং সংকলকটি ডিফল্ট টাইপের সাথে strategy = IMMEDIATEডাকা একটি ভেরিয়েবলের ঘোষণার জন্য গ্রহণ করেছিল , তবে ইতিমধ্যে এই নামের সাথে একটি ভেরিয়েবলের পূর্ববর্তী ঘোষণা ছিল।strategyint

তবে, আপনি যদি কার্যটিতে অ্যাসাইনমেন্টটি রাখেন তবে main()এটি একটি বৈধ কোড হবে:

#include <stdio.h>

enum { RANDOM, IMMEDIATE, SEARCH } strategy = IMMEDIATE;

int main(int argc, char** argv){
    strategy=SEARCH;
    printf("strategy: %d\n", strategy);

    return 0;
}

48

যখন তুমি বললে

enum {RANDOM, IMMEDIATE, SEARCH} strategy;

আপনি একটি একক উদাহরণ পরিবর্তনশীল তৈরি করেন, নামবিহীন এনামের 'কৌশল' বলে। এটি করার জন্য খুব দরকারী জিনিস নয় - আপনার টাইপিডেফের দরকার:

typedef enum {RANDOM, IMMEDIATE, SEARCH} StrategyType; 
StrategyType strategy = IMMEDIATE;

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

3
আমি বলেছিলাম এটি খুব বেশি কার্যকর ছিল না এবং আমি বিশ্বাস করি না এটিও। অবশ্যই, আমি নিজের কোডটিতে এই প্যাটার্নটি ব্যবহার করি না। YMMV।

3
@ HorseSMith একটি নামবিহীন এনাম খুব কার্যকর নয় কারণ আপনার কাছে সেই ধরণের কোনও অন্য চলক বা ফাংশন প্যারামিটার বা রিটার্ন মান থাকতে পারে না। যদি একটি ভেরিয়েবল আপনার প্রয়োজন হয় তবে তা ঠিক আছে।
বব স্টেইন

3
বেনামে এনাম ব্যবহার করছেন না এমন কেউ প্রমাণ করে না যে তাদের কোনও ব্যবহার নেই। আপনার টাইপিডের দরকার নেই। কিছু কোড নির্দেশিকা (কর্নেল.আর / ডক / ডকুমেন্টেশন / কোডিং স্টাইল) এমনকি এটিকে নিরুৎসাহিত করে।
মার্টিনকুনেভ

2
এই উত্তরটিও বিভ্রান্তিমূলক। তারকের উত্তরটি এখানে একমাত্র সঠিক।
নাইটপুল

13

যেমনটি লেখা আছে, আপনার কোডে কোনও ভুল নেই। আপনি কি নিশ্চিত যে আপনি এরকম কিছু করেন নি

int strategy;
...
enum {RANDOM, IMMEDIATE, SEARCH} strategy;

ত্রুটি বার্তাগুলি কোন লাইনে নির্দেশ করে? যখন এটি বলে যে "কৌশলটির পূর্ববর্তী ঘোষণা এখানে ছিল", "এখানে" কী এবং এটি কী দেখায়?


6
তিনি সম্ভবত strategy = IMMEDIATE;ফাইল-স্কোপেই করেছেন। একটি অ্যাসাইনমেন্ট ফাইলের সুযোগে সমস্ত ফাংশনের বাইরে ঘটতে পারে না। সুতরাং সংকলকটি ত্রুটিটি থেকে সেরাটি করার চেষ্টা করেছিল এবং ধরে int strategy = IMMEDIATE;নিয়েছিল তার অর্থ , এই মুহুর্তে দ্বন্দ্বটি ঘটেছে।
জোহানেস স্কাউব -

2
এটি সর্বোত্তম উত্তর, অন্যান্য উত্তরে এটির পক্ষে এত জটিল বিভ্রান্তি রয়েছে যা বেদনাদায়ক।
বিনোদন

12

@ থো অ্যাপেলসিন তার মন্তব্যে পোস্ট করা প্রশ্নে ঠিক বলেছেন। প্রশ্নে পোস্ট করা কোড স্নিপেট এটি বৈধ এবং কোনও ত্রুটি ছাড়াই। আপনার ত্রুটিটি অবশ্যই হওয়া উচিত কারণ আপনার সি উত্স ফাইলের অন্য কোনও জায়গায় অন্য খারাপ বাক্য গঠন। enum{a,b,c};তিন সিম্বলিক ধ্রুবক (সংজ্ঞায়িত a, bএবং c) যা মান পূর্ণসংখ্যা 0, 1এবং 2যথাক্রমে, কিন্তু আমরা ব্যবহার enumতার কারণ হল, আমরা সাধারণত নির্দিষ্ট পূর্ণসংখ্যা মান যত্ন সম্পর্কে না, আমরা প্রতীকী ধ্রুবক নামের অর্থ সম্পর্কে আরো যত্নশীল। এর অর্থ আপনার এটি থাকতে পারে:

#include <stdio.h>
enum {a,b,c};
int main(){
  printf("%d\n",b);
  return 0;
}

এবং এই আউটপুট হবে 1

এটিও বৈধ হবে:

#include <stdio.h>
enum {a,b,c};
int bb=b;
int main(){
  printf("%d\n",bb);
  return 0;
}

এবং আউটপুট আগের মত হবে।

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

enum {a,b,c};
enum {a,b,c};

আপনার একটি ত্রুটি হবে তবে আপনি যদি এটি করেন:

enum alfa{a,b,c};
enum alfa;

আপনার কোনও ত্রুটি থাকবে না।

তুমি এটি করতে পারো:

enum {a,b,c};
int aa=a;

এবং aaমান সহ পূর্ণসংখ্যার পরিবর্তনশীল হবে 0। তবে আপনি এটি করতে পারেন:

enum {a,b,c} aa= a;

এবং একই প্রভাব (যেমন, থাকবে aaএকটি হচ্ছে intসঙ্গে 0মান)।

আপনি এটি করতে পারেন:

enum {a,b,c} aa= a;
aa= 7;

এবং মান সহ aaহবে ।int7

কারণ আপনি ব্যবহারের সাথে প্রতীকী ধ্রুবক সংজ্ঞাটির পুনরাবৃত্তি করতে পারবেন না enum, যেমনটি আমি আগেই বলেছি, আপনি যদি ট্যাগগুলির intসাথে ওয়ার্স ঘোষণা করতে চান তবে আপনাকে অবশ্যই ট্যাগ ব্যবহার করতে হবে enum:

enum tag1 {a,b,c};
enum tag1 var1= a;
enum tag1 var2= b;

এর ব্যবহার typedefহ'ল প্রতিবার enum tag1পরিবর্তনশীল সংজ্ঞায়িত করতে আপনাকে লেখার হাত থেকে রক্ষা করা । আপনার সাথে typedefকেবল টাইপ করতে পারেন Tag1:

typedef enum {a,b,c} Tag1;
Tag1 var1= a;
Tag1 var2= b;

আপনারও থাকতে পারে:

typedef enum tag1{a,b,c}Tag1;
Tag1 var1= a;
enum tag1 var2= b;

শেষ কথাটি হ'ল যেহেতু আমরা সংজ্ঞায়িত প্রতীকী ধ্রুবকগুলির বিষয়ে কথা বলছি ব্যবহার করার সময় বড় বড় অক্ষর ব্যবহার করা ভাল enum, এটি উদাহরণস্বরূপ:

enum {A,B,C};

পরিবর্তে

enum {a,b,c};

10

এটি উল্লেখ করার মতো যে C ++ এ আপনি টাইপডেফ স্টেটমেন্টের প্রয়োজন ছাড়াই একটি নতুন ধরণের সংজ্ঞা দিতে "এনাম" ব্যবহার করতে পারেন।

enum Strategy {RANDOM, IMMEDIATE, SEARCH};
...
Strategy myStrategy = IMMEDIATE;

আমি এই পদ্ধতিকে অনেক বেশি বন্ধুত্বপূর্ণ মনে করি।

[সম্পাদনা করুন - স্পষ্ট করে সি ++ স্থিতি - আমার এটি প্রাথমিকভাবে ছিল, তারপরে এটি সরানো হয়েছে!]


হ্যাঁ, আপনি কখনই সি ++ তে এনামস (বা স্ট্রোক্ট, ইউনিয়ন ইত্যাদি) দিয়ে টাইপডেফ ব্যবহার করবেন না।

17
এই প্রশ্নটি সি এর জন্য, সি ++ এর জন্য নয়। সি-তে, উপরের কোডটি অবৈধ - আপনাকে হয় ব্যবহার করতে হবে typedef, বা enumভেরিয়েবল ঘোষণায়ও নির্দিষ্ট করতে হবে : এনাম স্ট্র্যাটেজি {র্যান্ডম, তাত্ক্ষণিক, অনুসন্ধান}; ... enum কৌশল myStrategy = তাত্পর্যপূর্ণ;
পাভেল মিনায়েভ

@ পাভেল - আমার খারাপ আমি প্রথমে "সি ++" এ ছিলাম, তারপরে কিছু গবেষণা করেছি যা দেখে মনে হয় এটি বিরোধী।
রডি

@ পাভেল আমি মনে করি এটির পৃথক উত্তর হওয়া উচিত যা ব্যবহারের সুবিধাগুলি বর্ণনা করে enum Strategy। আমি এটি করেছি, নীচে দেখুন।
জোহানেস স্কাউব -

8

ঘোষণাটি সম্পর্কে কোনও বিভ্রান্তি রয়েছে বলে মনে হয়।

নিম্নলিখিত হিসাবে strategyআগে আসে যখন {RANDOM, IMMEDIATE, SEARCH},

enum strategy {RANDOM, IMMEDIATE, SEARCH};

আপনি একটি নতুন ধরণের নাম তৈরি করছেন enum strategy। যাইহোক, ভেরিয়েবল ঘোষণা করার সময়, আপনাকে enum strategyনিজের ব্যবহার করা দরকার । আপনি শুধু ব্যবহার করতে পারবেন না strategy। সুতরাং নিম্নলিখিতটি অবৈধ।

enum strategy {RANDOM, IMMEDIATE, SEARCH};
strategy a;

যদিও, নিম্নলিখিতটি বৈধ

enum strategy {RANDOM, IMMEDIATE, SEARCH};

enum strategy queen = RANDOM;
enum strategy king = SEARCH;
enum strategy pawn[100];

যখন strategyপরে আসে {RANDOM, IMMEDIATE, SEARCH}, আপনি একটি বেনামী enum তৈরি করছেন এবং তারপর ঘোষণা strategyযে ধরনের একটি পরিবর্তনশীল যাবে।

সুতরাং এখন, আপনি যেমন কিছু করতে পারেন

enum {RANDOM, IMMEDIATE, SEARCH} strategy;
strategy = RANDOM;

যাইহোক, আপনি প্রকারের অন্য কোনও পরিবর্তনশীল ঘোষণা করতে পারবেন না enum {RANDOM, IMMEDIATE, SEARCH}কারণ আপনি কখনও নামকরণ করেন নি। সুতরাং নিম্নলিখিতটি অবৈধ

enum {RANDOM, IMMEDIATE, SEARCH} strategy;
enum strategy a = RANDOM;

আপনি উভয় সংজ্ঞা সংহত করতে পারেন

enum strategy {RANDOM, IMMEDIATE, SEARCH} a, b;

a = RANDOM;
b = SEARCH;
enum strategy c = IMMEDIATE;

Typedef হিসাবে পূর্বে উল্লিখিত একটি সংক্ষিপ্ত পরিবর্তনশীল ঘোষণা তৈরি করতে ব্যবহৃত হয়।

typedef enum {RANDOM, IMMEDIATE, SEARCH} strategy;

এখন আপনি enum {RANDOM, IMMEDIATE, SEARCH}সংকলকটি বলেছেন যে এটি সমার্থক strategy। সুতরাং এখন আপনি অবাধে strategyপরিবর্তনশীল প্রকার হিসাবে ব্যবহার করতে পারেন । আপনাকে enum strategyআর টাইপ করার দরকার নেই। নিম্নলিখিতটি এখন বৈধ

strategy x = RANDOM;

আপনি এনপ নামের সাথে টাইপদেফকেও সংযুক্ত করতে পারেন

typedef enum strategyName {RANDOM, IMMEDIATE, SEARCH} strategy;

এই পদ্ধতিটি ব্যবহার করার খুব বেশি সুবিধা নেই যে আপনি এখন ব্যবহার করতে পারবেন strategyএবং enum strategyNameবদলে যেতে পারবেন ।

typedef enum strategyName {RANDOM, IMMEDIATE, SEARCH} strategy;

enum strategyName a = RANDOM;
strategy b = SEARCH;

1
দুর্দান্ত উত্তর। আমি এনাম সংজ্ঞা এইভাবে লেখা জুড়ে এসেছি: typedef enum strategy {RANDOM, IMMEDIATE, SEARCH} strategyবা typedef enum strategy {RANDOM, IMMEDIATE, SEARCH} strategy_type। এর কি কোনও সুবিধা আছে typedef enum {RANDOM, IMMEDIATE, SEARCH} strategy? সম্পূর্ণরূপে আপনি কি আপনার উত্তরে এগুলি যুক্ত করে বিবেচনা করবেন?
tjalling

হ্যাঁ. আমি আমার উত্তরটি পরিবর্তন করেছি। আমার জ্ঞান অনুসারে, সাধারণ ক্ষেত্রে কোনও বড় সুবিধা নেই।
15:58 এ 8

2
দুর্দান্ত, আপনার উত্তরটি এখনই এটিকে coversেকে রাখে, ধন্যবাদ। একটি লজ্জাজনক বিষয় এ পর্যন্ত এটি উত্তর তালিকার নিচে, কমপক্ষে নয় কারণ এটি যথাযথ ব্যাখ্যা সহ মূল প্রশ্নটি স্পষ্টভাবে সম্বোধন করে।
tjalling

2

আপনি যদি গণনার জন্য নামটি ঘোষণা করেন তবে কোনও ত্রুটি ঘটবে না।

যদি ঘোষণা না করা হয় তবে আপনাকে একটি ব্যবহার করতে হবে typedef:

enum enum_name {RANDOM, IMMEDIATE, SEARCH} strategy;
strategy = IMMEDIATE;

এটি কোনও ত্রুটি প্রদর্শন করবে না ...


2

আমার প্রিয় এবং একমাত্র ব্যবহৃত নির্মাণ হ'ল সর্বদা:

typedef enum MyBestEnum
{
    /* good enough */
    GOOD = 0,
    /* even better */
    BETTER,
    /* divine */
    BEST
};

আমি বিশ্বাস করি এটি আপনার আপনার সমস্যা দূর করবে। নতুন টাইপ ব্যবহার করা আমার দৃষ্টিকোণ থেকে সঠিক বিকল্পটি।


1

তারকের উত্তর সবচেয়ে ভাল।

এনাম আলোচনার বেশিরভাগ অংশ হ'ল একটি রেড হেরিং।

এই কোড স্নিপেট তুলনা করুন: -

int strategy;
strategy = 1;   
void some_function(void) 
{
}

যা দেয়

error C2501: 'strategy' : missing storage-class or type specifiers
error C2086: 'strategy' : redefinition

এটি দিয়ে কোনও সমস্যা নেই যা সংকলন করে।

int strategy;
void some_function(void) 
{
    strategy = 1;   
}

ভেরিয়েবলটি strategyঘোষণাপত্রে বা কোনও ফাংশনের অভ্যন্তরে সেট করা দরকার You আপনি বিশ্বব্যাপী সুযোগে নির্বিচারে সফ্টওয়্যার - বিশেষ করে অ্যাসাইনমেন্ট লিখতে পারবেন না।

তিনি সত্যিকারের পরিবর্তে এনাম {র‌্যান্ডম, তাত্ক্ষণিক, অনুসন্ধান used ব্যবহার করেছেন এমন ঘটনা কেবলমাত্র এটিই প্রাসঙ্গিক যে এটি এমন লোককে বিভ্রান্ত করেছে যেগুলি এর বাইরে দেখতে পারে না। প্রশ্নের পুনঃনির্ধারণ ত্রুটি বার্তাগুলি দেখায় যে এটি লেখক ভুল করেছেন।

সুতরাং এখন আপনার দেখতে পারা উচিত নীচের উদাহরণের প্রথমটি কেন ভুল এবং অন্য তিনটি ঠিক আছে।

উদাহরণ 1. ভুল!

enum {RANDOM, IMMEDIATE, SEARCH} strategy;
strategy = IMMEDIATE;
void some_function(void) 
{
}

উদাহরণ 2. সঠিক।

enum {RANDOM, IMMEDIATE, SEARCH} strategy = IMMEDIATE;
void some_function(void) 
{
}

উদাহরণ 3. সঠিক।

enum {RANDOM, IMMEDIATE, SEARCH} strategy;
void some_function(void) 
{
    strategy = IMMEDIATE;
}

উদাহরণ 4. সঠিক।

void some_function(void) 
{
    enum {RANDOM, IMMEDIATE, SEARCH} strategy;
    strategy = IMMEDIATE;
}

যদি আপনার একটি কার্যনির্বাহী প্রোগ্রাম থাকে তবে আপনার স্নিপেটগুলি কেবল আপনার প্রোগ্রামে আটকানোতে সক্ষম হবেন এবং দেখুন যে কয়েকটি সংকলন করছে এবং কিছু না করে।


0

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

টাইপডেফ এনাম রাজ্য {a = 0, খ = 1, সি = 2} রাষ্ট্র ;

typedef enum state {a = 0, b = 1, c = 2} state;

typedef enum state old; // New type, alias of the state type.
typedef enum state new; // New type, alias of the state type.

new now     = a;
old before  = b;

printf("State   now = %d \n", now);
printf("Sate before = %d \n\n", before);

newসি পরিবারে সনাক্তকারীদের একটি খারাপ পছন্দ কারণ এটি সি ++ এ অপারেটর।
jww

0

সি

enum stuff q;
enum stuff {a, b=-4, c, d=-2, e, f=-3, g} s;

sসম্পূর্ণ প্রকার এবং ঘোষণার সাথে স্বাক্ষরিত পূর্ণসংখ্যার একটি অস্থায়ী সংজ্ঞা হিসাবে কাজ করে এমন ঘোষণা যা স্কোপগুলিতে qঅসম্পূর্ণ প্রকারের সাথে স্বাক্ষরিত পূর্ণসংখ্যার একটি অস্থায়ী সংজ্ঞা হিসাবে কাজ করে (যা সুযোগের সম্পূর্ণ ধরণের সমাধান করে কারণ প্রকারের সংজ্ঞাটি যে কোনও জায়গায় উপস্থিত রয়েছে সুযোগ) (যে কোনও স্থায়ী সংজ্ঞা, শনাক্তকারীদের মতো qএবং sএকই ধরণের অসম্পূর্ণ বা সম্পূর্ণ সংস্করণ intবা enum stuffএকাধিক বারের সাথে পুনরায় ঘোষিত করা যেতে পারে তবে কেবল স্কোপের মধ্যে একবার সংজ্ঞায়িত করা হয় যেমন int q = 3; এবং কেবলমাত্র একটি সাবস্কোপে নতুন সংজ্ঞা দেওয়া যেতে পারে, এবং সংজ্ঞা অনুসারে কেবল ব্যবহারযোগ্য)। এছাড়াও আপনি কেবল enum stuffসুযোগের মধ্যে একবারের সম্পূর্ণ ধরণের ব্যবহার করতে পারেন কারণ এটি কোনও ধরণের সংজ্ঞা হিসাবে কাজ করে।

enum stuffফাইলের স্কোপে (পূর্বে এবং নীচে ব্যবহারযোগ্য) পাশাপাশি একটি ফরোয়ার্ড প্রকারের ঘোষণাপত্র ( enum stuffটাইপটির একাধিক ঘোষণা থাকতে পারে তবে স্কোপে কেবল একটি সংজ্ঞা / সমাপ্তি এবং সাবস্কোপে নতুন সংজ্ঞা দেওয়া যেতে পারে ) এর জন্য একটি সংকলক গণনা প্রকার সংজ্ঞাও উপস্থিত রয়েছে for । এটি একটি কম্পাইলার নির্দেশ খেলোয়াড়রা হিসাবে কাজ করে arvalue সঙ্গে 0, bসঙ্গে -4, cসঙ্গে 5, dসঙ্গে -2, eসঙ্গে -3, fসঙ্গে -1এবং gসঙ্গে -2বর্তমান সুযোগ। অঙ্কের ধ্রুবকগুলি এখন পৃথক এনামে পরবর্তী পুনর্নির্ধারণ পর্যন্ত সংজ্ঞার পরে প্রয়োগ হয় যা একই স্কোপ স্তরে থাকতে পারে না।

typedef enum bool {false, true} bool;

//this is the same as 
enum bool {false, true};
typedef enum bool bool;

//or
enum bool {false, true};
typedef unsigned int bool;

//remember though, bool is an alias for _Bool if you include stdbool.h. 
//and casting to a bool is the same as the !! operator 

এনম, স্ট্রাক্ট এবং ইউনিয়ন দ্বারা ভাগ করা ট্যাগের নাম স্থানটি পৃথক এবং সি এর পরে কীওয়ার্ড (এনাম, স্ট্রাক্ট বা ইউনিয়ন) টাইপ দ্বারা উপসর্গ করা আবশ্যক enum a {a} b, enum a cঅবশ্যই ব্যবহার করা উচিত এবং না a c। কারণ ট্যাগ নেমস্পেস আইডেন্টিফায়ার নেমস্পেসের সাথে পৃথক, enum a {a} bঅনুমোদিত তবে enum a {a, b} bএটি স্থির হয় না কারণ ধ্রুবকগুলি ভেরিয়েবল আইডেন্টিফায়ার, আইডেন্টিফায়ার নেমস্পেসের একই নামস্থানে থাকে। typedef enum a {a,b} bএছাড়াও অনুমোদিত নয় কারণ টাইপিডেফ-নামগুলি শনাক্তকারী নেমস্পেসের অংশ।

enum boolধরণীর ধরণগুলি ধরণের ধীরে ধীরে সি তে নিম্নলিখিত ধরণগুলি অনুসরণ করে:

+--------------+-----+-----+-----+
|   enum bool  | a=1 |b='a'| c=3 |  
+--------------+-----+-----+-----+
| unsigned int | int | int | int |  
+--------------+-----+-----+-----+

+--------------+-----+-----+-----+
|   enum bool  | a=1 | b=-2| c=3 |  
+--------------+-----+-----+-----+
|      int     | int | int | int |  
+--------------+-----+-----+-----+

+--------------+-----+---------------+-----+
|   enum bool  | a=1 |b=(-)0x80000000| c=2 |
+--------------+-----+---------------+-----+
| unsigned int | int |  unsigned int | int |
+--------------+-----+---------------+-----+

+--------------+-----+---------------+-----+
|   enum bool  | a=1 |b=(-)2147483648| c=2 |
+--------------+-----+---------------+-----+
| unsigned int | int |  unsigned int | int |
+--------------+-----+---------------+-----+

+-----------+-----+---------------+------+
| enum bool | a=1 |b=(-)0x80000000| c=-2 |
+-----------+-----+---------------+------+
|    long   | int |      long     |  int |
+-----------+-----+---------------+------+

+-----------+-----+---------------+------+
| enum bool | a=1 | b=2147483648  | c=-2 |
+-----------+-----+---------------+------+
|    long   | int |      long     |  int |
+-----------+-----+---------------+------+

+-----------+-----+---------------+------+
| enum bool | a=1 | b=-2147483648 | c=-2 |
+-----------+-----+---------------+------+
|    int    | int |      int      |  int |
+-----------+-----+---------------+------+

+---------------+-----+---------------+-----+
|   enum bool   | a=1 | b=99999999999 | c=1 |
+---------------+-----+---------------+-----+
| unsigned long | int | unsigned long | int |
+---------------+-----+---------------+-----+

+-----------+-----+---------------+------+
| enum bool | a=1 | b=99999999999 | c=-1 |
+-----------+-----+---------------+------+
|    long   | int |      long     |  int |
+-----------+-----+---------------+------+

এটি সিতে সূক্ষ্ম সংকলন করে:

#include <stdio.h>
enum c j;
enum c{f, m} p;
typedef int d;
typedef int c;
enum c j;
enum m {n} ;
int main() {
  enum c j;
  enum d{l};
  enum d q; 
  enum m y; 
  printf("%llu", j);
}

সি ++

সি ++ এ, এনামগুলিতে একটি প্রকার থাকতে পারে

enum Bool: bool {True, False} Bool;
enum Bool: bool {True, False, maybe} Bool; //error

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

এনামগুলির নিয়মগুলি সি ++ এ আলাদা।

#include <iostream>
c j; //not allowed, unknown type name c before enum c{f} p; line
enum c j; //not allowed, forward declaration of enum type not allowed and variable can have an incomplete type but not when it's still a forward declaration in C++ unlike C
enum c{f, m} p;
typedef int d;
typedef int c; // not allowed in C++ as it clashes with enum c, but if just int c were used then the below usages of c j; would have to be enum c j;
[enum] c j;
enum m {n} ;
int main() {
  [enum] c j;
  enum d{l}; //not allowed in same scope as typedef but allowed here 
  d q;
  m y; //simple type specifier not allowed, need elaborated type specifier enum m to refer to enum m here
  p v; // not allowed, need enum p to refer to enum p
  std::cout << j;
}

সি ++ এ এনাম ভেরিয়েবলগুলি কেবল স্বাক্ষরবিহীন পূর্ণসংখ্যাদি ইত্যাদি নয়, এগুলিও এনাম প্রকারের এবং কেবল এনামগুলিতে স্থায়ী নিয়োগ দেওয়া যেতে পারে। এটি তবে ফেলে দেওয়া যেতে পারে।

#include <stdio.h>
enum a {l} c;
enum d {f} ;
int main() {
  c=0; // not allowed;
  c=l;
  c=(a)1;
  c=(enum a)4;
  printf("%llu", c); //4
}

এনাম ক্লাস

enum struct অনুরূপ enum class

#include <stdio.h>
enum class a {b} c;
int main() {
  printf("%llu", a::b<1) ; //not allowed
  printf("%llu", (int)a::b<1) ;
  printf("%llu", a::b<(a)1) ;
  printf("%llu", a::b<(enum a)1);
  printf("%llu", a::b<(enum class a)1) ; //not allowed 
  printf("%llu", b<(enum a)1); //not allowed
}

স্কোপ রেজোলিউশন অপারেটরটি এখনও স্কোডবিহীন এনামগুলিতে ব্যবহার করা যেতে পারে।

#include <stdio.h>
enum a: bool {l, w} ;
int main() {
  enum a: bool {w, l} f;
  printf("%llu", ::a::w);
}

তবে যেহেতু ডব্লিউটিকে স্কোপের অন্য কিছু হিসাবে সংজ্ঞায়িত করা যায় না, ::wএবং এর মধ্যে কোনও পার্থক্য নেই::a::w

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