【发布时间】:2011-03-14 21:14:22
【问题描述】:
我正在使用一个遗留的 C 库接口(到 C++),它将不透明指针公开为
typedef void * OpaqueObject
在图书馆里:
OpaqueObject CreateObject()
{
return new OurCppLibrary::Object();
}
这当然不会为这个库的客户提供任何类型安全。将 typedef 从 void 指针更改为结构指针是否应该完全相同,但提供少量类型安全?
typedef struct OpaqueObjectInternal_ *OpaqueObject
// OpaqueObjectInternal_ is NEVER defined anywhere in client or library code
现在我明确指向一个结构,即使我真的没有指向一个结构,是否还有任何对齐问题或其他需要担心的问题?
【问题讨论】:
-
C 中没有名为
new的运算符!! -
@Mahesh:我认为 OP 正在用 C++ 包装一个 C 库;
new发生在 C++ 中(从OurCppLibrary限定符推断) -
void *作为一个不透明的对象非常有意义 - 你的事情的结束不会弄乱对象,他们知道如何处理它。如果有的话,将其设为void *会更安全,只要您按照描述将其与他们的 API 一起使用即可。 -
@James:我不明白,删除类型信息如何使它更安全?考虑这个例子:
void some_api_func(void*); int* i = ...; some_api_func(i); // oops!。类型安全不会发生这种情况。 -
@James:我真的希望编译器能够捕获尽可能多的错误。如果给你一个 ObjectInternal_ *,你打算用它做什么?我认为传递错误对象的可能性要远大于使用没有内部结构或使用它的方法的类型。
标签: c++ c typedef opaque-pointers