반응형

http://blog.naver.com/sorkelf/40138272917



C++11 강력해진 Enumeration과 전방선언 Strongly typed enumerations


Strongly typed enumerations


이전 C++에서의 Enumeration은 안전한 타입이 아니었다. 따로 enum값을 취하려고 해도 결과적으로는 Int형이기 때문에 얼마든지 캐스팅이 가능한 형태를 띄고 있었다.


enum Color { ClrRed, ClrBlue, ClrYellow, ClrGreen, ClrBlack };

enum Alert { AltGreen, AltYello, AltRed };


bool is_danger(Alert alert)

{

    return alert == ClrRed; // OK...다른 enum형도 비교 가능

}


영역부분에선

enum Color { Red }; 
enum Alert { Red }; // 에러

C++0x에서는 [enum class / enum struct] 형식이 추가 되어 위와 같은 문제를 해결할 수 있게 되었다.

enum class Enumeration 
{ 
     Val1, 
     Val2, 
     Val3 = 100,
     Val4 /* = 101 */ 
};


이 형태의 enumeratrion은 타입안전을 보장하며 enum 클래스 값은 명시적으로 int형으로 캐스팅 할 수 없다.

그러므로 이들은 여타 다른 enum값이나 int 형과 비교 할 수 없다 ( 컴파일 에러출력)

또한, enum 클래스의 기본타입은 기본값은 int형이나 아래와 같이 명시적으로 다른 타입을 지정 할 수도 있다.


enum class Enum2 : unsigned int { Val1, Val2};


또한 이전 처럼 클래스가 아닌 기존 enum을 사용할 수 잇으며 처음 기본 값을 지정해줄 수도 있다


enum Enum3 : unsigned long {Val1 = 1, Val2};


C++0x에서는 enum의 크기(size) 만큼 명시적으로든 암시적으로든 선언이 가능하게 되었다.

enum Enum1; //C++, C++0x 어느쪽에서도 컴파일 에러이다 (정의되어있지 않음) 
enum Enum2 : unsigned int; //C++0x에선 가능, 기본 유형을 명시적으로 지정했음 
enum class Enum3; //C++0x에선 가능, 기본 타입은 Int 형 
enum class Enum4 : unsigned int; //C++0x 에서 가능. 
enum Enum2 : unsigned short; //C++0x에서 불가, Enum2가 기본타입을 이미 위에서 명시하고 있음





Enum Class 전방선언




C++0x에서는 struct나 class 처럼 enum도 전방선언이 가능하게 되었다


아래와 같은 헤더파일이 있다고 할때

// Color.h

enum Color

    .... 

};

void draw(Color& color);


draw 함수의 선언에서는 color내의 enum형을 필요하지 않지만

C++03에서는 enum을 전방선언하는것이 불가능했기 때문에

Color의 enum형을 변경하려면 관련된 모든 파일을 재컴파일을 해야 했다


C++0x에서는 enum의 전방선언이 가능하게 되어

아래와 같이 쓰는것이 가능해졌다

// Color.h 

enum Color int; 


void draw(Color& color);

// Color.cpp 

enum Color : int 
{
    ... 
}; 

void draw(Color& color) 
    ... 
}

위와 같이 쓰면 Color의 enum형을 변경한다 해도

재컴파일은 Color.cpp만 하면된다


Enum의 전방선언을 하려면 

기본이 되는 형 (ex : int 형)을 지정해야 한다


enum E; //에러 
enum E : int//OK

Enum의 재선언을 할때에는 기본형이 같아야 한다


enum E : int
enum E : short// 에러!! 기본형이 일치하지 않음 
enum E : int// OK


또, enum의 전방선언은 영역이 존재하는 enum값인 enum클래스에서도 적용되어 있다

enum class E : int; //OK


클래스나 네임스페이스에서 선언했단 enum도 스코프를 지정해서 정의할 수 있다

struct S 
{ 
    enum E : int; 
    E e; 
}; 

enum S::E : int 
{
    ... 
};



반응형

+ Recent posts