我正在浏览一些提供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
是否会更好。
答案 0 :(得分:1)
在这种情况下,reinterpret_cast
相当于static_cast
到cv void*
,然后是目标指针类型的另一个static_cast
。这是C ++ 11的一个补充,我相信并且在C ++ 03中没有,你必须编写两个static_cast
来获得可移植的行为。
答案 1 :(得分:0)
我认为在这种情况下您必须使用reinterpret_cast
,因为c_object
的类型为void
,
因此o
属于void *
。编译器无法猜测o
是什么。它必须是一个运行时演员。