[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에 네임 스페이스가 없지만 기술적으로 올바르지 않다고 말합니다. 세 가지가 있습니다.

  1. 태그 ( enum, unionstruct)
  2. 라벨
  3. (다른 모든 것)

typedef enum { } XYZ;익명 열거를 선언하고 이름이있는 전역 네임 스페이스로 가져옵니다 XYZ.

typedef enum ABC { } XYZ;ABC태그 네임 스페이스에 명명 된 열거 형을 선언 한 다음로 글로벌 네임 스페이스로 가져옵니다 XYZ.

어떤 사람들은 별도의 네임 스페이스를 사용하지 않고 모든 것을 typedef합니다. 다른 사람들은 네임 스페이스를 원하기 때문에 typedef하지 않습니다.


답변

이것은 오래된 종류이지만 어쨌든 올해 초에 그것을 보았을 때 내가 고맙게 생각한 것처럼 입력하려고하는 링크에 감사 드리기를 바랍니다.

여기 있습니다 . 나는 불쾌한 타입 정의를 파악해야 할 때 항상 내 마음 속에있는 설명을 인용해야합니다.

변수 선언에서 소개 된 이름은 해당 유형의 인스턴스입니다. […] 그러나 typedef키워드가 선언 앞에 오면 소개 된 이름은 해당 유형의 별명입니다.

많은 사람들이 이전에 말했듯이 C ++ 에서 열거 형을 선언하는 typedef를 사용할 필요가 없습니다 . 그러나 이것이 typedef의 구문에 대한 설명입니다! 나는 그것이 도움이되기를 바랍니다 (아마도 10 년이 지났지 만 이러한 종류의 것들을 이해하기 위해 고군분투하는 사람은 OP가 아닐 것입니다).