programing

C에서 열거형(enum)을 정의하려면 어떻게 해야 합니까?

goodsources 2022. 8. 11. 22:23
반응형

C에서 열거형(enum)을 정의하려면 어떻게 해야 합니까?

Cenums를 사용하는 적절한 구문이 무엇인지 잘 모르겠습니다.다음 코드가 있습니다.

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

그러나 컴파일되지 않고 다음 오류가 발생합니다.

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

내가 뭘 잘못하고 있지?

열거형 변수 선언은 다음과 같이 수행됩니다.

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;

지적할 가치가 있습니다.typedef

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

typedef하지 않으면 enum strategy하면 하면 돼요'라고 하면 strategy.

양쪽 다 장단점이 있다.더, 해 주십시오.struct statstat기능: 이것들도 경합하지 않습니다).또, 곧바로 타입임을 알 수 있습니다.다른 하나는 더 짧지만 일반 네임스페이스에 유형 식별자를 가져옵니다.

하려고 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★」strategy두 번, 그래서 위의 오류가 발생하는 것입니다. 사용할 수 하면 다음과 같습니다.gcc -ansi -pedantic -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 의 경우, 「」라고 하는 변수 선언을 합니다.strategy 타입 " " " " 입니다.int이 이름을 가진 변수의 선언이 이미 있었습니다.

을 에 , 에 배치되어 .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;
}

당신이 말할 때

enum {RANDOM, IMMEDIATE, SEARCH} strategy;

이름 없는 열거형의 'instance'라는 단일 인스턴스 변수를 만듭니다.이것은 그다지 도움이 되지 않습니다.typedef가 필요합니다.

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

선언문에 혼란이 있는 것 같다.

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}후 "anonymous 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}는 is is isonomonomonomonomonomonomonomonomonomonomonom와 같은 입니다.strategy 해서 이제는 롭게 사용할 수 되었습니다.strategy변수 유형으로 지정합니다. 입력하지 됩니다.enum strategy다음 유효합니다.

strategy x = RANDOM;

Typedef와 열거형 이름을 조합하여 얻을 수도 있습니다.

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

이할 수 된것는 별로 이 없어요.strategy ★★★★★★★★★★★★★★★★★」enum strategyName서로 교환할 수 있습니다.

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

enum strategyName a = RANDOM;
strategy b = SEARCH;

@Tho Apelsin th @ @ @ @ @ 。질문에 게재된 코드 스니펫은 유효하며 오류는 없습니다.이 오류는 c 소스 파일의 다른 위치에 있는 잘못된 구문이 원인일 수 있습니다. enum{a,b,c}; 상수즉, 3개의 심볼 )를 나타냅니다.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는 값이 "Manager" 인 정수 변수가 .0 과 같은 할 수도 있습니다. 단, 다음과 같은 작업을 수행할 수도 있습니다.

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

같은( (마이너스,aa가가 an being beingint0값)을 설정합니다.

다음 작업도 수행할 수 있습니다.

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

그리고 그리고.aa될 것이다것이다int값 가치 있게와7.

왜냐하면 당신은기호 상수의 사용과 함께 상징적인 상수 정의 말 못할수 없기 때문입니다 반복할 정의를.enum로 전에 말한 경우앞서말한 바와 같이,신고하려면태그를 사용해야 합니다한다고 고백하고 싶어, 태그를 사용해야 합니다.intVars사용으로 대표의 사용과 함께.enum:

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

의 사용의 사용이다.typedef그것은 매번 글쓰기를하기 위해서다 않도록 하질 때마다 글을 써서 안전하게 보호하는 것이다.enum tag1변수를 정의합니다.변수를 정의합니다.A함께로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};

내가 가장 좋아하고 유일하게 사용한 건축물은 다음과 같다.

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

저는 이것이 당신의 문제를 해결해 줄 것이라고 믿습니다.새로운 타입을 사용하는 것은 나의 권리 옵션이다.

쓰여진 대로, 당신의 코드에는 아무런 문제가 없습니다.너 정말 그런 거 안 해봤어?

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

오류 메시지가 가리키는 행은 무엇입니까?"이전 '전략' 선언이 있었다"고 하면, "여기에"는 무엇이고, 무엇을 나타냅니까?

Tarc의 대답이 최고야.

열거된 논의의 대부분은 속임수이다.

다음 코드 스니펫을 비교합니다.-

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선언 시 또는 함수 내부에서 설정해야 합니다.글로벌 범위에서 임의 소프트웨어(특히 할당)를 작성할 수 없습니다.

int 대신 enum {RANDOM, Immediate, SEARCH}을(를) 사용했다는 사실은 그 밖을 볼 수 없는 사람들을 혼란스럽게 하는 정도에서만 관련이 있습니다.문제의 정의 오류 메시지는 저자가 잘못했다는 것을 보여준다.

이제 아래 예제의 첫 번째가 잘못된 이유를 알 수 있고 나머지 세 가지는 정상입니다.

예 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;
}

동작하고 있는 프로그램이 있는 경우는, 이러한 스니펫을 프로그램에 붙여넣기만 하면, 컴파일과 그렇지 않은 것을 확인할 수 있습니다.

C++에서는 typedef 문을 사용하지 않고 "enum"을 사용하여 새로운 유형을 정의할 수 있습니다.

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

나는 이 접근법이 훨씬 더 우호적이라고 생각한다.

[편집 - C++ 상태 명확화 - 원래 이거 넣고 있다가 삭제했어]

열거할 이름을 선언하면 오류가 발생하지 않습니다.

않은 ""를 .typedef:

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

에러는 표시되지 않습니다.

gcc로 시도했지만 필요에 따라 마지막 대안을 사용해야 했습니다. 오류 없이 컴파일할 수 밖에 없었습니다.

typedef 열거 상태 {a = 0, b = 1, c = 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);

C

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

있는 정수의 .scomplete 하여 부호 정수의 합니다.q (의 장소에 내의 (정의와 「」( 「」)가 ).q ★★★★★★★★★★★★★★★★★」s는, 같은 한 버전 또는 할 수 .int ★★★★★★★★★★★★★★★★★」enum stuffint q = 3과 같이 범위에서 한 번만 정의되며 서브스코프에서만 재정의될 수 있으며 정의 후에만 사용할 수 있습니다.)의 경우만 할 수 .enum stuff유형 정의로 기능하기 때문에 스코프에 한 번 표시됩니다.

:enum stuff는, 타입 「」(타입)도 있습니다.enum stuff는 복수의 선언을 포함할 수 있지만, 스코프에서 정의/완료된 것은 1개뿐입니다.이치노, 컴파일러의 로서도 기능해, 「」를 합니다.a rvalue 포함0,b-4,c5,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 

및이며, 키워드( 또는 union structure union 뒤에 structure union이 붙습니다.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상수는 C에서 다음 패턴을 따릅니다.

+--------------+-----+-----+-----+
|   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 |
+-----------+-----+---------------+------+

이것은 C:로 컴파일 됩니다.

#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);
}

C++

C++ 에서는, enum 에 타입을 지정할 수 있습니다.

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

이 경우 상수와 식별자는 모두 같은 유형인 bool을 가지며, 그 유형으로 숫자를 나타낼 수 없는 경우 오류가 발생합니다.=2일 수도 있고, 그건 부울이 아니야.또한 True, False 및 Bool은 소문자로 입력할 수 없습니다.그렇지 않으면 언어 키워드와 충돌합니다.열거형에는 포인터 형식을 사용할 수도 없습니다.

C++에서는 enum 규칙이 다릅니다.

#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;
}

C++의 enums 변수는 더 이상 부호 없는 정수 등이 아니며 열거형이며 열거형에서만 상수를 할당할 수 있습니다.그러나 이는 폐기할 수 있습니다.

#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 클래스

enum struct is is is is is is 와 같다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는 범위 내에서 다른 것으로 정의할 수 없기 때문에, w는 범위 내에서 다른 것으로 할 수 없습니다.::w ★★★★★★★★★★★★★★★★★」::a::w

언급URL : https://stackoverflow.com/questions/1102542/how-to-define-an-enumerated-type-enum-in-c

반응형