반응형
윈도우즈 프로그래밍 도중 void*을 인자로 받는 함수에 enum 타입을 캐스팅하여 전달하였는데, 그 함수 내에서 다시 enum 타입으로 변환하여 switch문에 활용하려 했다. if문을 사용하면 되지만 그냥 switch case를 사용하고 싶었음. 그래서 캐스팅 방법을 알아보던 도중 void*을 uintptr_t 타입으로 변환할 수 있는 것을 알게 됨. uintptr_t는 unsigned int 타입을 재정의한 것으로 이름과 달리 포인터 타입이 아님. 이 타입은 WinAPI의 UINT_PTR 타입과 동일한데, 어디서 본 것 같은 타입. WPARAM이 바로 UINT_PTR 타입.
어쨌든 다음과 같이 void*를 두 단계에 거쳐 enum 타입으로 변환할 수 있다. enum class 타입도 동일하게 가능. 하지만 enum에서 void*로 변환한 결과는 할당되지 않은 메모리 주소이므로 역참조하지 않도록 조심.
enum eColor
{
RED = 1,
GREEN,
BLUE
};
eColor color1 = eColor::RED;
eColor color2 = eColor::GREEN;
eColor color3 = eColor::BLUE;
// eColor to void*
void* voidPtr1 = reinterpret_cast<void*>(color1);
void* voidPtr2 = reinterpret_cast<void*>(color2);
void* voidPtr3 = reinterpret_cast<void*>(color3);
// void* to eColor
// void* -> uintptr_t -> eColor
// void* to uintptr_t
auto red = reinterpret_cast<uintptr_t>(voidPtr1);
auto green = reinterpret_cast<uintptr_t>(voidPtr2);
auto blue = reinterpret_cast<uintptr_t>(voidPtr3);
// uintptr_t to eColor
auto result1 = static_cast<eColor>(red);
auto result2 = static_cast<eColor>(green);
auto result3 = static_cast<eColor>(blue);
switch(result2)
{
case eColor::RED:
cout << "it's a red" << endl;
break;
case eColor::GREEN:
cout << "it's a green" << endl;
break;
case eColor::BLUE:
cout << "it's a blue" << endl;
}
<Output>
'C,C++ > Etc' 카테고리의 다른 글
멀티 스레드 잠금 순서 문제 풀어보기 (0) | 2020.08.18 |
---|---|
스레드 관련 글 (0) | 2020.06.25 |
Visual Studio C++ 17 사용하도록 설정하기 (0) | 2020.06.25 |
메모리 정렬과 패킹 (2) | 2020.05.19 |
[C++] 비트 연산자로 N번째 비트 변경하기 (0) | 2020.03.11 |
댓글