[c++] C ++에서 열거 형을 선언 할 때 typedef를 사용하는 이유는 무엇입니까?
몇 년 동안 C ++을 작성하지 않았으므로 이제 C ++로 돌아 가려고합니다. 나는 이것을 가로 질러 포기하는 것에 대해 생각했다.
typedef enum TokenType
{
blah1 = 0x00000000,
blah2 = 0X01000000,
blah3 = 0X02000000
} TokenType;
이게 뭐야? typedef
키워드 가 왜 여기에 사용됩니까? TokenType
이 선언에서 이름 이 두 번 나타나는 이유는 무엇 입니까? 시맨틱은 이것과 어떻게 다른가요?
enum TokenType
{
blah1 = 0x00000000,
blah2=0x01000000,
blah3=0x02000000
};
답변
C에서 열거 형을 첫 번째 방법으로 선언하면 다음과 같이 사용할 수 있습니다.
TokenType my_type;
두 번째 스타일을 사용하면 다음과 같이 변수를 선언해야합니다.
enum TokenType my_type;
다른 사람들이 언급했듯이 C ++에서는 차이가 없습니다. 내 생각에는 이것을 작성한 사람이 C 프로그래머이거나 C 코드를 C ++로 컴파일하는 것입니다. 어느 쪽이든 코드의 동작에는 영향을 미치지 않습니다.
답변
다음과 같은 경우 C의 C 유산입니다.
enum TokenType
{
blah1 = 0x00000000,
blah2 = 0X01000000,
blah3 = 0X02000000
};
다음과 같은 작업을 수행해야합니다.
enum TokenType foo;
그러나 이렇게하면 :
typedef enum e_TokenType
{
blah1 = 0x00000000,
blah2 = 0X01000000,
blah3 = 0X02000000
} TokenType;
당신은 선언 할 수 있습니다 :
TokenType foo;
그러나 C ++에서는 이전 정의 만 사용하고 마치 C typedef에있는 것처럼 사용할 수 있습니다.
답변
당신은 그것을 할 필요가 없습니다. C (C ++ 아님) 에서는 열거 형의 데이터 요소를 참조하기 위해 enum Enumname 을 사용해야했습니다 . 단순화하기 위해 단일 이름 데이터 형식 으로 typedef 할 수있었습니다 .
typedef enum MyEnum {
//...
} MyEnum;
열거 형의 매개 변수를 취하는 함수를 다음과 같이 정의 할 수 있습니다.
void f( MyEnum x )
더 이상
void f( enum MyEnum x )
typename의 이름이 열거 형의 이름과 같을 필요는 없습니다. 구조체에서도 마찬가지입니다.
반면에 C ++에서는 열거 형, 클래스 및 구조체에 이름으로 유형에 직접 액세스 할 수 있으므로 필요하지 않습니다.
// C++
enum MyEnum {
// ...
};
void f( MyEnum x ); // Correct C++, Error in C
답변
C에서는 유형을 열거 형 이외의 것으로 변경할 수 있기 때문에 좋은 스타일입니다.
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 */
C ++에서는 열거 형을 정의하여 C ++ 또는 C로 컴파일 할 수 있습니다.
답변
C에서 이월
답변
어떤 사람들은 C에 네임 스페이스가 없지만 기술적으로 올바르지 않다고 말합니다. 세 가지가 있습니다.
- 태그 (
enum
,union
및struct
) - 라벨
- (다른 모든 것)
typedef enum { } XYZ;
익명 열거를 선언하고 이름이있는 전역 네임 스페이스로 가져옵니다 XYZ
.
typedef enum ABC { } XYZ;
ABC
태그 네임 스페이스에 명명 된 열거 형을 선언 한 다음로 글로벌 네임 스페이스로 가져옵니다 XYZ
.
어떤 사람들은 별도의 네임 스페이스를 사용하지 않고 모든 것을 typedef합니다. 다른 사람들은 네임 스페이스를 원하기 때문에 typedef하지 않습니다.
답변
이것은 오래된 종류이지만 어쨌든 올해 초에 그것을 보았을 때 내가 고맙게 생각한 것처럼 입력하려고하는 링크에 감사 드리기를 바랍니다.
여기 있습니다 . 나는 불쾌한 타입 정의를 파악해야 할 때 항상 내 마음 속에있는 설명을 인용해야합니다.
변수 선언에서 소개 된 이름은 해당 유형의 인스턴스입니다. […] 그러나
typedef
키워드가 선언 앞에 오면 소개 된 이름은 해당 유형의 별명입니다.
많은 사람들이 이전에 말했듯이 C ++ 에서 열거 형을 선언하는 typedef를 사용할 필요가 없습니다 . 그러나 이것이 typedef의 구문에 대한 설명입니다! 나는 그것이 도움이되기를 바랍니다 (아마도 10 년이 지났지 만 이러한 종류의 것들을 이해하기 위해 고군분투하는 사람은 OP가 아닐 것입니다).