2013-07-16 32 views
3

a)X1和X2是否等于?如果不是,应该如何进行明确的重新解释/常量转换?是char ** x =(char **)arg等效于reinterpret_cast <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 *的数组是合法的。如果一个reinterpret_cast是一个指向U *指针的T *指针(对于任意类型T和U,相关或其他)并返回T *,则保证返回原始值。所以是的,可以构建一个代码在这个代码中工作的例子。当然,这并不意味着功能设计得很好。

2

是的,他们基本上是相同的,除了C++风格的演员显示代码的读者,你正在做一些奇怪的东西,而它很难注意到c风格。

它的合法但一如既往高度怀疑,当一个常量传入参数被转换为非常量。

相关问题