这是什么reinterpret_cast惯例?它比static_cast更好吗?

时间:2013-10-07 19:24:36

标签: c++ casting coding-style conventions reinterpret-cast

我正在浏览一些提供c api的c ++包装器代码,并且我发现reinterpret_cast很多static_cast就足够了,例如:

struct cpp_object{ void foo(){ /* do something */ } };

/* begin: c api */
typedef void c_object;

void foo(c_object *o)
{
    // why this:
    reinterpret_cast<cpp_object *>(o)->foo();
    // instead of just:
    static_cast<cpp_object *>(o)->foo();
}
/* end: c api */

一般情况下,我在极少数情况下使用reinterpret_cast,主要与缓冲内容的强制位纠正有关,知道布局和大小的类型,已知位于缓冲区内容中。

所以我问这种做法是否有意义或坚持static_cast是否会更好。

2 个答案:

答案 0 :(得分:1)

在这种情况下,reinterpret_cast相当于static_castcv void*,然后是目标指针类型的另一个static_cast。这是C ++ 11的一个补充,我相信并且在C ++ 03中没有,你必须编写两个static_cast来获得可移植的行为。

答案 1 :(得分:0)

我认为在这种情况下您必须使用reinterpret_cast,因为c_object的类型为void, 因此o属于void *。编译器无法猜测o是什么。它必须是一个运行时演员。