Am'm nu sunt sigur ce este buna sintaxa pentru utilizarea C enum. Am urmatorul cod:
enum {RANDOM, IMMEDIATE, SEARCH} strategy;
strategy = IMMEDIATE;
Dar acest lucru nu compila, cu următoarea eroare:
error: conflicting types for ‘strategy’
error: previous declaration of ‘strategy’ was here
Ce fac gresit?
L's valoare de subliniind faptul că tu nu't nevoie o typedef
. Puteți face doar cum ar fi următoarele
enum strategy { RANDOM, IMMEDIATE, SEARCH };
enum strategy my_strategy = IMMEDIATE;
L's un stil întrebarea dacă preferați typedef
. Fără ea, dacă doriți să se refere la tipul enumerare, aveți nevoie pentru a utiliza enum strategie
. Cu acesta, puteți spune doar "strategie".
Ambele moduri au pro și contra. Cel mai prolix, dar păstrează tip de identificatori în tag-namespace unde au câștigat't conflict cu obișnuite de identificare (cred că de `struct stat " și " stat de funcții: acestea nu't de conflict ori), și în cazul în care veți vedea imediat că-l's un tip. Celălalt este mai scurt, dar aduce tip de identificatori în comun de nume.
Declararea unui enum variabile se face astfel:
enum strategy {RANDOM, IMMEDIATE, SEARCH};
enum strategy my_strategy = IMMEDIATE;
Cu toate acestea, puteți utiliza un typedef
pentru a scurta declarații de variabile, astfel:
typedef enum {RANDOM, IMMEDIATE, SEARCH} strategy;
strategy my_strategy = IMMEDIATE;
Având o convenție de denumire pentru a distinge între tipuri și variabile este o idee bună:
typedef enum {RANDOM, IMMEDIATE, SEARCH} strategy_type;
strategy_type my_strategy = IMMEDIATE;
Te're încercarea de a declara "strategie" de două ori, și că's de ce ai're primesc eroarea de mai sus. Următoarele lucrări fără nici o plângeri (compilat cu gcc-ansi -pendantic -Perete`):
#include <stdio.h>
enum { RANDOM, IMMEDIATE, SEARCH } strategy = IMMEDIATE;
int main(int argc, char** argv){
printf("strategy: %d\n", strategy);
return 0;
}
Dacă în loc de cele de mai sus, cea de-a doua linie s-au schimbat pentru:
...
enum { RANDOM, IMMEDIATE, SEARCH } strategy;
strategy = IMMEDIATE;
...
De la avertismente, ai putea vedea cu ușurință greșeala ta:
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
Deci compilatorul luat strategie = IMEDIATĂ pentru o declarație de o variabilă numită "strategie" cu default tip int
, dar acolo era deja o declarație anterioară a unei variabile cu acest nume.
Cu toate acestea, dacă ai pus o însărcinare în main () funcția, ar fi un cod valid:
#include <stdio.h>
enum { RANDOM, IMMEDIATE, SEARCH } strategy = IMMEDIATE;
int main(int argc, char** argv){
strategy=SEARCH;
printf("strategy: %d\n", strategy);
return 0;
}
Când spui
enum {RANDOM, IMMEDIATE, SEARCH} strategy;
creați un singur exemplu de variabilă, numit 'strategie' de un nume enum. Acest lucru nu este un lucru foarte util pentru a face - ai nevoie de un typedef:
typedef enum {RANDOM, IMMEDIATE, SEARCH} StrategyType;
StrategyType strategy = IMMEDIATE;
După cum este scris, acolo's-a întâmplat nimic cu cod. Ești sigur că te-ai't face ceva de genul
int strategy;
...
enum {RANDOM, IMMEDIATE, SEARCH} strategy;
Ce linii de mesaje de eroare punctul a? Atunci când se spune "declarație anterioară de 'strategie' a fost aici", ce's "aici" și ceea ce nu se arată?
@ThoAppelsin în comentariul său la întrebarea postat este corect. Fragmentul de cod scris în întrebarea este valabilă și fără erori. Eroarea trebuie să fie pentru alte rele sintaxă în orice alt loc de c fișierul sursă. enum{a,b,c};
definește trei constantele simbolice ("a", " b " și "c"), care sunt numere întregi cu valorile 0
,1
și 2
respectiv, dar când ne-am folosi enum
este pentru că nu ne't de obicei pasă specifice valoare întreagă, ne pasă mai mult despre sensul simbolic numele constantă.
Acest lucru înseamnă că puteți fi asta:
#include <stdio.h>
enum {a,b,c};
int main(){
printf("%d\n",b);
return 0;
}
și acest lucru va genera 1
.
Acest lucru, de asemenea, va fi valabil:
#include <stdio.h>
enum {a,b,c};
int bb=b;
int main(){
printf("%d\n",bb);
return 0;
}
și va afișa același ca și mai înainte.
Dacă veți face acest lucru:
enum {a,b,c};
enum {a,b,c};
vei avea o eroare, dar dacă faci acest lucru:
enum alfa{a,b,c};
enum alfa;
tu nu va avea nici o eroare.
puteți face acest lucru:
enum {a,b,c};
int aa=a;
și " aa "va fi o variabilă întreagă cu valoarea "0". dar puteți, de asemenea, face acest lucru:
enum {a,b,c} aa= a;
și va avea același efect (care este, " aa " fiind un int
cu 0
valoare).
de asemenea, puteți face acest lucru:
enum {a,b,c} aa= a;
aa= 7;
și aa
va fi int
cu valoarea 7
.
pentru că nu se poate repeta simbolic constantă definiție cu utilizarea de enum
, după cum am spus anterior, trebuie să utilizați tag-uri, dacă doriți să declar int
vars cu utilizarea de enum
:
enum tag1 {a,b,c};
enum tag1 var1= a;
enum tag1 var2= b;
utilizarea typedef
este de a în condiții de siguranță la scris, de fiecare dată enum tag1
pentru a defini variabile. Cu typedef
aveți posibilitatea să tastați doar Tag1
:
typedef enum {a,b,c} Tag1;
Tag1 var1= a;
Tag1 var2= b;
Puteți, de asemenea:
typedef enum tag1{a,b,c}Tag1;
Tag1 var1= a;
enum tag1 var2= b;
Ultimul lucru pe care să-l spun este că, din moment ce vorbim despre definite constantele simbolice este mai bine să utilizați cu litere capitalizate atunci când se utilizează enum
, care este, de exemplu:
enum {A,B,C};
în loc de
enum {a,b,c};
L's de remarcat faptul că în C++ puteți utiliza "enum" pentru a defini un nou tip fără a avea nevoie de o declarație typedef.
enum Strategy {RANDOM, IMMEDIATE, SEARCH};
...
Strategy myStrategy = IMMEDIATE;
Am găsit această abordare mult mai prietenos.
[edit - a clarificat C++ status - am avut inițial, apoi a scos-o!]
Nu pare a fi o confuzie cu privire la declarație.
Atunci când strategia'comes înainte de {ALEATOARE, IMEDIATĂ, de CĂUTARE}
ca și în următoarele,
enum strategy {RANDOM, IMMEDIATE, SEARCH};
creați un nou tip numit enum strategie
. Cu toate acestea, atunci când se declară variabile, aveți nevoie pentru a utiliza `enum strategie în sine. Nu puteți folosi doar termenul de "strategie". Deci, următorul text este invalid.
enum strategy {RANDOM, IMMEDIATE, SEARCH};
strategy a;
În timp ce, următoarele este valabilă
enum strategy {RANDOM, IMMEDIATE, SEARCH};
enum strategy queen = RANDOM;
enum strategy king = SEARCH;
enum strategy pawn[100];
Când "strategia" vine după {ALEATOARE, IMEDIATĂ, de CĂUTARE}
, creați un anonim enum și apoi declararea "strategia" de a fi o variabilă de acest tip.
Acum, puteți face ceva de genul
enum {RANDOM, IMMEDIATE, SEARCH} strategy;
strategy = RANDOM;
Cu toate acestea, nu poate declara orice alte variabile de tip enum {ALEATOARE, IMEDIATĂ, de CĂUTARE}` pentru că niciodată nu au nume. Deci, următorul text este invalid
enum {RANDOM, IMMEDIATE, SEARCH} strategy;
enum strategy a = RANDOM;
Puteți combina ambele definiții prea
enum strategy {RANDOM, IMMEDIATE, SEARCH} a, b;
a = RANDOM;
b = SEARCH;
enum strategy c = IMMEDIATE;
Typedef
cum sa menționat mai înainte este folosit pentru a crea o scurtă declarație de variabilă.
typedef enum {RANDOM, IMMEDIATE, SEARCH} strategy;
Acum ai spus compiler care enum {ALEATOARE, IMEDIATĂ, de CĂUTARE}
este sinonim cu termenul de "strategie". Deci, acum puteți utiliza în mod liber "strategia" ca tip de variabilă. Nu't nevoie să tastați `enum strategie mai. Următoarele este valabilă acum
strategy x = RANDOM;
Puteți combina, de asemenea, Typedef, împreună cu enum nume pentru a obține
typedef enum strategyName {RANDOM, IMMEDIATE, SEARCH} strategy;
Nu's nu de mult avantaj al folosind această metodă, în afară de faptul că acum puteți folosi strategia " și " enum strategyName` alternativ.
typedef enum strategyName {RANDOM, IMMEDIATE, SEARCH} strategy;
enum strategyName a = RANDOM;
strategy b = SEARCH;
Dacă ai declara numele de enumerare nici o eroare va apărea.
Dacă nu sunt declarate, trebuie să utilizați un typedef
:
enum enum_name {RANDOM, IMMEDIATE, SEARCH} strategy;
strategy = IMMEDIATE;
Acesta nu va afișa o eroare...
Meu preferat și folosit numai de construcție a fost mereu:
typedef enum MyBestEnum { /* suficient */ BUN = 0, /* chiar bine */ Mai BINE, /* divin */ Cel MAI bun };
Eu cred că acest lucru va elimina problema ai. Folosind noul tip este din punctul meu de vedere, dreptul de opțiune.
Tarc's este răspunsul cel mai bun.
Mult de enum discuție este un hering roșu.
Compara acest fragment de cod:-
int strategy;
strategy = 1;
void some_function(void)
{
}
care dă
error C2501: 'strategy' : missing storage-class or type specifiers
error C2086: 'strategy' : redefinition
cu aceasta, care compilează cu nici o problema.
int strategy;
void some_function(void)
{
strategy = 1;
}
Variabila "strategie" trebuie să fie stabilite în declarația sau în interiorul unei funcții etc. Nu poți scrie arbitrare software - misiuni în special - la aplicare la nivel mondial.
Faptul că el a folosit enum {ALEATOARE, IMEDIATĂ, de CĂUTARE} în loc de int este relevantă numai în măsura în care acesta a confundat oameni care pot't vedea dincolo de ea. Redefinirea mesaje de eroare în cauză arată că acest lucru este ceea ce autorul a făcut greșit.
Deci, acum ar trebui să fie capabil pentru a vedea de ce primul exemplu de mai jos este greșit, iar alte trei sunt în regulă.
Exemplul 1. GRESIT!
enum {RANDOM, IMMEDIATE, SEARCH} strategy;
strategy = IMMEDIATE;
void some_function(void)
{
}
Exemplul 2. CORECT.
enum {RANDOM, IMMEDIATE, SEARCH} strategy = IMMEDIATE;
void some_function(void)
{
}
Exemplul 3. CORECT.
enum {RANDOM, IMMEDIATE, SEARCH} strategy;
void some_function(void)
{
strategy = IMMEDIATE;
}
Exemplul 4. CORECT.
void some_function(void)
{
enum {RANDOM, IMMEDIATE, SEARCH} strategy;
strategy = IMMEDIATE;
}
Dacă aveți un program de lucru ar trebui să fie doar posibilitatea de a lipi aceste fragmente în programul tău și văd că unele compila și unele nu.
Am incercat cu gcc și să vină cu pentru nevoia mea am fost nevoit să folosesc ultima alternativa, pentru a compila cu eroare.
typedef enum stat {a = 0, b = 1, c = 2} stat;
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);