2013-07-16 5 views
3

a) 아래의 X1과 X2는 동일합니까? 그렇지 않다면 어떻게 명시 적으로 재 해석/const 캐스팅을 수행해야합니까?은 reinterpret_cast에 해당하는 char ** x = (char **) arg <char**> (const_cast <void*> (arg))입니까?

void some_legacy_function(const void* arg) { 
    char** X1 = (char**) arg; 
    char** X2 = reinterpret_cast<char**>(const_cast<void*>(arg) ); 
    /* not surprisingly, indexing into X1 randomly crashes in release build */ 
} 

b)이 캐스트는 나에게 상당히 이상하게 보입니다. 실제로 상황에 따라 100 % 합법적입니까?

답변

4

a) 첫 번째 줄은 static_cast<char**>(const_cast<void*>(arg))과 같습니다. 어떤 차이를 만들어내는 것은 아닙니다.

b) arg가 실제로 char * 배열을 가리키는 경우 글쎄요. 하나의 포인터가 U * 포인터에 대한 T * 포인터 (임의의 유형 T와 U에 관련되거나 그렇지 않은 경우)와 T *로 되돌아 가면 원래 값을 되 찾을 수 있습니다. 그래서 예,이 코드가 작동하는 예제를 만들 수 있습니다. 물론 기능이 잘 설계된 것은 아닙니다.

2

그렇습니다. C++ 스타일 캐스트는 독자가 코드를 읽는 사람에게 이상한 것을하고있는 반면 C 스타일은 눈치 채기 어렵습니다.

const 들어오는 매개 변수가 아닌 const로 캐스팅 될 때 항상 그 법령의 용의도가 ​​높습니다.

관련 문제