1

我知道在 C 中看起来像这样的 pimpl-idiom:

// foobar.h
struct FooBar {
    char *someString;
    struct FooBarImpl *pImpl;
};
// foobar.c
struct FooBarImpl {
    char *hiddenString;
};

但是,通过类型转换,我可以摆脱不透明的指针并减少有人弄乱实现的可能性:

// foobar.h
struct FooBar {
    char *someString
};
// foobar.c
struct FooBarImpl {
    // FooBar members
    char *someString
    // FooBarImpl members
    char *hiddenString
};

在后一种情况下,任何对 FooBar 进行操作的函数都将简单地类型转换为 FooBarImpl 以访问“私有”成员。

例如,如果有人向 FooBar 添加一些成员但对 FooBarImpl 不这样做,我可以看到这将如何成为一个问题。但是在我的情况下 FooBar 将只包含一个成员并且不太可能改变。

当我希望隐藏实现细节时,这会被认为是一种好的做法,还是应该坚持使用 pimpl-idiom?

谢谢你。

4

2 回答 2

2

编译器是你的朋友;不要通过使用显式类型转换来欺骗它,尤其是在复合类型之间。坚持第一种方法,如果您前向声明实现结构,您将永远不必透露其内容。

于 2011-08-01T00:00:40.560 回答
0

在使用在结构之间进行类型转换的代码时,您必须非常小心:

  1. 您无法创建 FooBar 数组或将指向此类数组的指针提供给客户端代码。
  2. 分配或 memcpy:ing 结构(不是它们的指针)将需要分配 FooBarImpl,而不是 FooBar - 否则特定于实现的数据将被切断。
  3. 从标题看,库的用户可能会错误地认为 memcpying 或分配或创建 FooBar 结构是正确的 - 毕竟,它似乎包含的只是可以轻松填充的基本数据。
于 2011-08-01T01:06:41.637 回答