1

假设有一个接口规范“X”。X 要求调用XHeader.h一个结构X_Fiddle来保证成员的存在foobar,两者都是 type int。然而,实现定义的成员并没有被禁止,如果这样做可以提高效率,实际上是被鼓励的。我需要为我工作的公司编写 X 的实现,并意识到有一些特定于我的实现的成员来存储一些状态会非常方便,所以我写了以下内容:

typedef struct X_Fiddle {
    int foo; /* Guaranteed by spec */
    int bar; /* Guaranteed by spec */
    size_t dinky_dingbat; /* IMPLEMENTATION-SPECIFIC, DO NOT USE */
    unsigned char *dingbat_data; /* IMPLEMENTATION-SPECIFIC, DO NOT USE */
} X_Fiddle;

当然,没有什么可以告诉用户dinky_dingbat或者dingbat_data不应该使用的,因为它们是特定于实现的细节,并且可能在未来的某个时候改变或消失。鉴于我无法通过使用不透明指针之类的东西来隐藏实现,我应该怎么做才能使这些内部成员脱颖而出(或其他技巧来隐藏这些东西)?是否有任何常用/标准的方法来处理此类问题?我能想到的最好的方法是使用前导下划线之类的命名约定,但我不确定前导下划线规则是否适用于成员变量,而且我感觉我也混淆了一些 C++ 特定规则。我还想过将它们命名为类似的名称,INTERNAL_dinky_dingbat或者为内部包含的内部类型设置一个单独的结构X_Fiddle,但我想尽量减少额外的输入,所以我有点不喜欢它们。或者仅仅拥有一个如上所述的普通结构是否完全可以接受,其中特定于实现的细节在评论和文档中详细说明,当我需要改变事情时,让经验不足和勤奋的人遭受他们自己造成的伤害?

假设我是从头开始和/或我的公司/团队对这种特定情况没有约定。

4

2 回答 2

2

即使PIMPL成语是 C++ 的东西,它实际上在纯 C 中作为匿名void指针使用的时间更长。

如果您希望结构具有私有实现特定字段,则为这些私有字段创建一个结构,并将void指针字段添加到公共结构。然后有一个initorcreate函数来分配这个私有结构,并使void公共结构中的指针字段指向那个私有结构。

于 2013-06-05T12:25:30.543 回答
1

GLib 对象系统提供了一个具有数据隐藏和继承功能的对象系统。如果你不能在你的应用程序中使用它,你至少可以从中得到一些想法。

于 2013-06-05T12:33:41.840 回答