C++ 캐스팅 ( reinterpret_cast)

2013. 11. 24. 10:45C++


reinterpret_cast는 어떠한 포인터 타입도 어떠한 포인터 타입으로든 변환이 가능하다.
즉, 아래와 같은 것들이 가능하다는 것이다.
  • 어떠한 정수 타입도 어떠한 포인터 타입으로 변환이 가능하고, 그 역(포인터 타입->정수 타입)도 가능하다.
  • int* 에서 char* 로, 또는 One_Class* 에서 Unrelated_Class* 로도 가능하다.
얼핏 봤을 때 상당히 자유롭고 강력한 캐스터 같지만, 특수한 케이스가 아니면 사용하지 않는 것을 권한다.

우선, 전통적인 캐스팅의 개념에서 벗어날 수 있는 포인터 변환 등이 reinterpret_cast를 씀으로써 강제 형변환되기 때문이다.
변환 관계에 놓인 두 개체의 관계가 명확하거나, 특정 목적을 달성하기 위할 때만 사용하는 것이 바람직하다.

게다가 이 연산자가 적용된 후의 변환 결과는 거의 항상 컴파일러에 따라 다르게 정의되어 있다.
따라서, 이 캐스팅 연산자가 쓰인 소스는 직접 다른 곳에 소스 이식이 불가능할 수 있다. (거의 그렇다)

다음은 MSDN의 예제 코드이다.

// expre_reinterpret_cast_Operator.cpp 
// compile with: /EHsc 

#include <iostream

// 포인터의 주소에 기반하여 해쉬 값을 반환함.
unsigned short Hashvoid *p ) 
{
// reinterpret_cast로 void* -> int 형변환
// 물론 C 스타일 캐스팅 : val = (unsigned int)p; 로도 가능하긴 하다.
unsigned int val = reinterpret_cast<unsigned int>( p ); 
return ( unsigned short )( val ^ (val >> 16) ); 
}

int main() 
int a[20]; 

for ( int i = 0; i < 20; i++ ) 
std::cout << Hash( a + i ) << std::endl
}