http://blog.naver.com/sorkelf/40138272917
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형도 비교 가능
}
영역부분에선
C++0x에서는 [enum class / enum struct] 형식이 추가 되어 위와 같은 문제를 해결할 수 있게 되었다.
이 형태의 enumeratrion은 타입안전을 보장하며 enum 클래스 값은 명시적으로 int형으로 캐스팅 할 수 없다.
그러므로 이들은 여타 다른 enum값이나 int 형과 비교 할 수 없다 ( 컴파일 에러출력)
또한, enum 클래스의 기본타입은 기본값은 int형이나 아래와 같이 명시적으로 다른 타입을 지정 할 수도 있다.
또한 이전 처럼 클래스가 아닌 기존 enum을 사용할 수 잇으며 처음 기본 값을 지정해줄 수도 있다
C++0x에서는 enum의 크기(size) 만큼 명시적으로든 암시적으로든 선언이 가능하게 되었다.
Enum Class 전방선언
C++0x에서는 struct나 class 처럼 enum도 전방선언이 가능하게 되었다
아래와 같은 헤더파일이 있다고 할때
enum Color
{
....
};
void draw(Color& color);draw 함수의 선언에서는 color내의 enum형을 필요하지 않지만
C++03에서는 enum을 전방선언하는것이 불가능했기 때문에
Color의 enum형을 변경하려면 관련된 모든 파일을 재컴파일을 해야 했다
C++0x에서는 enum의 전방선언이 가능하게 되어
아래와 같이 쓰는것이 가능해졌다
위와 같이 쓰면 Color의 enum형을 변경한다 해도
재컴파일은 Color.cpp만 하면된다
Enum의 전방선언을 하려면
기본이 되는 형 (ex : int 형)을 지정해야 한다
Enum의 재선언을 할때에는 기본형이 같아야 한다
또, enum의 전방선언은 영역이 존재하는 enum값인 enum클래스에서도 적용되어 있다
클래스나 네임스페이스에서 선언했단 enum도 스코프를 지정해서 정의할 수 있다
'프로그래밍(Programming) > c++, 11, 14 , 17, 20' 카테고리의 다른 글
deprecated declaration (0) | 2015.07.14 |
---|---|
십육진수 헥사 문자열을, 숫자(정수)로 변환 예제 (0) | 2015.03.11 |
roundoff error 라운드 오프 에러 (0) | 2014.12.08 |
구조체 메모리 저장방식 #pragma pack (0) | 2014.12.06 |
C++0x 람다 표현식 (0) | 2014.08.01 |