假设有一个接口(interface)规范“X”。 X 要求 XHeader.h
有一个名为 X_Fiddle
的结构,它保证成员 foo
和 bar
的存在,都是 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
,因为它们是特定于实现的细节,可能会在某些时候更改或消失 future 。鉴于我不能通过使用不透明指针之类的东西来隐藏实现,我应该怎么做才能让这些内部成员脱颖而出(或其他技巧来隐藏这些东西)?是否有处理此类问题的常用/标准方法?我能想到的最好的方法是使用像前导下划线这样的命名约定,但我不确定前导下划线规则是否适用于成员变量,而且我感觉我也混淆了一些 C++ 特定规则。我还考虑过将它们命名为 INTERNAL_dinky_dingbat
或为包含在 X_Fiddle
中的内部类型创建一个单独的结构,但我想将额外的输入保持在最低限度,所以我有点不喜欢他们。或者仅仅拥有一个像上面那样简单、普通的结构是完全可以接受的,在评论和文档中详细说明了具体实现的细节,当我需要改变周围的东西时,让经验不足和勤奋的人遭受他们自己造成的伤害?
假设我是从头开始和/或我的公司/团队没有针对这种特定情况的约定。
最佳答案
即使 PIMPL习语是 C++ 的东西,它实际上在纯 C 中用作匿名 void
指针的时间更长。
如果您希望该结构具有私有(private)实现特定字段,则为这些私有(private)字段创建一个结构,并向公共(public)结构添加一个 void
指针字段。然后有一个 init
或 create
函数分配这个私有(private)结构,并使公共(public)结构中的 void
指针字段指向该私有(private)结构。
关于c - 区分 C 中特定于实现的类型和变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16939811/