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 stat
및stat
기능: 이것들도 경합하지 않습니다).또, 곧바로 타입임을 알 수 있습니다.다른 하나는 더 짧지만 일반 네임스페이스에 유형 식별자를 가져옵니다.
하려고 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★」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 beingint
0
값)을 설정합니다.
다음 작업도 수행할 수 있습니다.
enum {a,b,c} aa= a;
aa= 7;
그리고 그리고.aa
될 것이다것이다int
값 가치 있게와7
.
왜냐하면 당신은기호 상수의 사용과 함께 상징적인 상수 정의 말 못할수 없기 때문입니다 반복할 정의를.enum
로 전에 말한 경우앞서말한 바와 같이,신고하려면태그를 사용해야 합니다한다고 고백하고 싶어, 태그를 사용해야 합니다.int
Vars사용으로 대표의 사용과 함께.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;
있는 정수의 .s
complete 하여 부호 정수의 합니다.q
(의 장소에 내의 (정의와 「」( 「」)가 ).q
★★★★★★★★★★★★★★★★★」s
는, 같은 한 버전 또는 할 수 .int
★★★★★★★★★★★★★★★★★」enum stuff
int q = 3과 같이 범위에서 한 번만 정의되며 서브스코프에서만 재정의될 수 있으며 정의 후에만 사용할 수 있습니다.)의 경우만 할 수 .enum stuff
유형 정의로 기능하기 때문에 스코프에 한 번 표시됩니다.
:enum stuff
는, 타입 「」(타입)도 있습니다.enum stuff
는 복수의 선언을 포함할 수 있지만, 스코프에서 정의/완료된 것은 1개뿐입니다.이치노, 컴파일러의 로서도 기능해, 「」를 합니다.a
rvalue 포함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
및이며, 키워드( 또는 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
'programing' 카테고리의 다른 글
C 구조체의 부재 숨기기 (0) | 2022.08.11 |
---|---|
O(1)의 reducx/vuex 저장소의 요소를 업데이트하려면 어떻게 해야 합니까? (0) | 2022.08.11 |
컴포넌트가 정의되어 있지만 사용되지 않는 vars는 사용되지 않습니다. (0) | 2022.08.11 |
Java에서의 문자열 암호화 방법 (0) | 2022.08.11 |
비동기 데이터 내의 Vuej + SSR + router.push() (0) | 2022.08.11 |