1

我正在查看一些提供 ac 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会更好。

4

2 回答 2

1

在这种情况下,reinterpret_cast等效于一个static_castto cv void*,然后是另一个static_cast指向目标指针类型。我相信这是对 C++11 的补充,并且在 C++03 中不存在,您必须在其中编写两个static_casts 才能获得可移植行为。

于 2013-10-07T19:31:55.363 回答
0

我认为在这种情况下你必须使用reinterpret_cast因为 c_objectis of type void,so ois of void *。编译器猜不到o就是这样。它必须是运行时演员表。

于 2013-10-07T19:28:21.187 回答