다음을 통해 공유


enum 클래스(C++ 구성 요소 확장)

네임스페이스 범위에서 열거자로 명명된 상수 집합으로 구성된 사용자 정의 형식인 열거형을 선언합니다.

모든 런타임

설명

C++/CX과 C++/CLI는 표준 C++ enum class 와 유사하지만 액세스 가능성 한정자가 추가된 public enum class 및 private enum class 를 지원합니다. /clr에서, C++11 enum class 형식은 허용되지만, C++/CX와 C++/CLI 형식이 아닌 원하는 ISO 열거형을 보장하도록 만들어진 C4472경고를 생성합니다. ISO 표준 C++ enum 키워드에 대한 자세한 내용은 C++ 열거형 선언을 참조하십시오.

Windows 런타임

구문

access enum class enumeration-identifier [:underlying-type] { enumerator-list } [var];
access enum struct enumeration-identifier [:underlying-type] { enumerator-list } [var];

매개 변수

  • access
    열거형의 액세스 가능성은 public 또는 private이 될 수 있습니다.

  • enumeration-identifier
    열거형의 이름입니다.

  • underlying-type
    (선택 사항) 열거형의 내부 형식입니다.

    (선택 사항. Windows 런타임만 해당) 열거형의 내부 형식은 bool, char, char16, int16, uint16, int, uint32, int64 또는 uint64가 될 수 있습니다.

  • enumerator-list
    열거자 이름의 쉼표로 구분된 목록입니다.

    각 열거자의 값은 컴파일러에 의해 암시적으로 정의되거나 표기법, enumerator = constant-expression 에 의해 명시적으로 정의됩니다. 기본적으로 암시적으로 정의된 경우 첫 번째 열거자의 값은 0입니다. 각 후속 암시적으로 정의된 열거자의 값은 이전 열거자 + 1의 값입니다.

  • var
    (선택 사항) 열거형 형식의 변수 이름입니다.

설명

자세한 내용과 예제를 보려면 Enums 을 참조하십시오.

컴파일러는 열거자의 값을 정의하는 상수 식을 underlying-type으로 표현할 수 없는 경우 오류 메시지를 내보냅니다. 그러나 컴파일러는 내부 형식에 적절하지 않은 값에 대해서는 오류로 보고하지 않습니다. 예를 들면 다음과 같습니다.

  • underlying-type 이 숫자이고, 열거자가 해당 형식의 최대값을 지정하는 경우, 그 다음에 암시적으로 정의되는 열거형 값은 표현할 수 없습니다.

  • 만일 underlying-type 이 bool 인 경우, 세 개 이상의 열거자가 암시적으로 정의되고, 처음 두 열거자 다음의 열거자는 표현할 수 없습니다.

  • 만일 underlying-type 이 char16 이고, 열거형 값이 0xD800에서 0xDFFF까지이면 값을 표현할 수 있습니다. 그러나 이 값은 유니코드 써로게이트 쌍의 절반을 나타내므로 논리적으로 정확하지 않고 단독으로 나타나서도 안됩니다.

요구 사항

컴파일러 옵션: /ZW

공용 언어 런타임

구문

access enum class name [:type] { enumerator-list } var;
access enum struct name [:type] { enumerator-list } var;

매개 변수

  • access
    열거형의 액세스 가능성. public 또는 private이 될 수 있습니다.

  • enumerator-list
    열거형에서 식별자(열거자)의 쉼표로 구분된 목록입니다.

  • name
    열거형의 이름입니다. 익명의 관리되는 열거형은 허용되지 않습니다.

  • type(선택적 요소)
    identifiers의 내부 형식입니다. 이것은 int, short 또는 long의 signed나 unsigned버전과 같은 스칼라형식이 될 수 있습니다. bool 또는 char 역시 가능합니다.

  • var(선택적 요소)
    열거형 형식의 변수 이름입니다.

설명

enum classenum struct는 동일한 선언입니다.

열거형에는 관리또는 C++/CX와 표준이라는 두 가지 유형이 있습니다.

다음과 같이 관리되거나 C++/CX 열거형을 정의할 수 있습니다,

public enum class day {sun, mon };

또한 의미적으로 다음과 같습니다.

ref class day {
public:
   static const int sun = 0;
   static const int mon = 1;
};

다음과 같은 표준 열거형을 정의할 수 있습니다.

enum day2 { sun, mon };

또한 의미적으로 다음과 같습니다.

static const int sun = 0;
static const int mon = 1;

관리되는 열거자 이름(identifiers)은 열거가 정의된 범위에 주입되지 않습니다. 열거자에 대한 모든 참조는 정규화되어야 합니다(name::identifier). 이런 이유로 익명 관리되는 열거형을 정의할 수 없습니다.

표준 열거형의 열거자는 바깥쪽 범위에 강력하게 포함됩니다. 즉, 포함 범위에 있는 열거자로 같은 이름을 가진 다른 기호가 있는 경우 컴파일러는 오류를 생성합니다.

Visual C++ 2002 및 Visual C++ 2003에서 열거자는 약하게 삽입되었습니다(이름이 같은 다른 식별자가 없는 한 바깥쪽 범위에 표시).

표준 C++ enum이 정의된 경우 ( 클래스 또는 struct없이), /clr 을 사용하여 컴파일하면 열거형이 관리되는 enum으로 컴파일됩니다. 열거형에는 여전히 관리되지 않는 열거형의 의미 체계가 있습니다. 컴파일러는 열거형을 네이티브 열거형이 되도록 하려는 프로그래머의 의도를 Visual C++ 컴파일러가 인식하는 [Microsoft::VisualC::NativeEnumAttribute] 특성을 추가합니다. 다른 컴파일러는 단순히 표준 열거형을 관리 열거형으로 간주합니다.

/clr을 사용하여 컴파일되고 명명된 표준 enum은 어셈블리에서 관리되는 enum으로 표시되며, 관리되는 다른 컴파일러가 이 enum을 사용할 수 있습니다. 그러나 명명되지 않은 표준 열거형은 어셈블리에서 공개적으로 표시되지 않습니다.

Visual C++ 2002 및 Visual C++ 2003에서 함수 매개 변수에 형식으로 사용되는 표준 열거형:

// mcppv2_enum.cpp
// compile with: /clr
enum E { a, b };
void f(E) {System::Console::WriteLine("hi");}

int main() {
   E myi = b;
   f(myi);
}

함수 시그니처를 위해 MSIL에서 다음을 내보냅니다.

void f(int32);

그러나 현재 컴파일러 버전에서 표준 enum은 함수 시그니처에 대한 MSIL에서 [NativeEnumAttribute] 및 다음을 포함하여 관리되는 enum으로 내보내집니다.

void f(E)

네이티브 열거형에 대한 자세한 내용은 C++ Enumeration Declarations를 참조하십시오.

CLR 열거형에 대한 자세한 내용은 다음을 참조하십시오.

요구 사항

컴파일러 옵션: /clr

예제

예제

desc

// mcppv2_enum_2.cpp
// compile with: /clr
// managed enum
public enum class m { a, b };

// standard enum
public enum n { c, d };

// unnamed, standard enum
public enum { e, f } o;

int main() 
{
   // consume managed enum
   m mym = m::b;
   System::Console::WriteLine("no automatic conversion to int: {0}", mym);
   System::Console::WriteLine("convert to int: {0}", (int)mym);

   // consume standard enum
   n myn = d;
   System::Console::WriteLine(myn);

   // consume standard, unnamed enum
   o = f;
   System::Console::WriteLine(o);
} 

Output

  
  
  
  

참고 항목

개념

런타임 플랫폼의 구성 요소 확장