c - 열거형 - enum 이란



C에서 강력한 형식의 열거 형을 에뮬레이션하는 방법? (2)

C는 네임 스페이스를 제공하지 않으므로 대신 접두사를 사용할 수 있습니다.

enum MyEnum {
    MyEnumA = 1,
    MyEnumB,
    MyEnumC
};

enum OtherEnum {
    OtherEnumA = 1,
    OtherEnumB
};

그런 다음 변수 선언을 간결하게하기 위해 다음과 같이 열거 형의 유형을 선언 할 수 있습니다.

typedef enum MyEnum MyEnum;
typedef enum OtherEnum OtherEnum;

마지막으로, 당신은 MyEnum 타입에 대한 MyEnum 의 암묵적인 변환을 허용하고 싶지 않습니다. Clang은 -Wenum-conversion 플래그를 제공합니다 (저는 GCC에 비슷한 플래그가 있다고 생각하지 않습니다).

/tmp/test.c:24:20: warning: implicit conversion from enumeration type 'enum OtherEnum' to different enumeration type 'MyEnum' (aka 'enum MyEnum') [-Wenum-conversion]
    MyEnum value = OtherEnumB;
           ~~~~~   ^~~~~~~~~~
1 warning generated.

이것은 단순하고, 이해하기 쉽고, (적어도 최소한) IDE의 자동 완성과 잘 작동하는 장점이 있습니다.

C ++ 03에서는 강력한 형식의 열거 형 을 클래스 (또는 네임 스페이스)에 넣음으로써 에뮬레이션 할 수 있습니다.

struct MyEnum
{
  enum enumName
  {
    VALUE_1 = 1,
    VALUE_2,
  };
};

그것을 사용하는 것 :

MyEnum::enumName v = MyEnum::VALUE_1;

C에서 비슷한 것을 할 수 있습니까? 그렇다면 어떻게?

나는 이런 식으로 시도했지만 그 과정에서 효과가 없다.

struct A
{
  enum aa
  {
    V1 = 5
  };
};

int main()
{
  A::aa a1 = A::V1;
  enum A::aa a2 = A::V1;
  struct A::aa a3 = A::V1;

  return 0;
}

당신은 이것을 할 수 있습니다 :

// Declare A to use for an enumeration, and declare some values for it.
typedef struct { int i; } A;
#define A0  ((A) { 0 })
#define A1  ((A) { 1 })

// Declare B to use for an enumeration, and declare some values for it.
typedef struct { int i; } B;
#define B0  ((B) { 0 })
#define B1  ((B) { 1 })


void foo(void)
{
    // Initialize A.
    A a = A0;

    // Assign to A.
    a = A1;

    // Assign a value from B to A.
    a = B0; // Gets an error.
}

이는 타이핑을 제공하지만 열거 형과 그 값으로 수행하고자하는 다른 연산이 무엇인지에 따라 성가심이 될 수 있습니다.





enums