c - 区分 C 中特定于实现的类型和变量

标签 c naming-conventions data-hiding

假设有一个接口(interface)规范“X”。 X 要求 XHeader.h 有一个名为 X_Fiddle 的结构,它保证成员 foobar 的存在,都是 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_dingbatdingbat_data,因为它们是特定于实现的细节,可能会在某些时候更改或消失 future 。鉴于我不能通过使用不透明指针之类的东西来隐藏实现,我应该怎么做才能让这些内部成员脱颖而出(或其他技巧来隐藏这些东西)?是否有处理此类问题的常用/标准方法?我能想到的最好的方法是使用像前导下划线这样的命名约定,但我不确定前导下划线规则是否适用于成员变量,而且我感觉我也混淆了一些 C++ 特定规则。我还考虑过将它们命名为 INTERNAL_dinky_dingbat 或为包含在 X_Fiddle 中的内部类型创建一个单独的结构,但我想将额外的输入保持在最低限度,所以我有点不喜欢他们。或者仅仅拥有一个像上面那样简单、普通的结构是完全可以接受的,在评论和文档中详细说明了具体实现的细节,当我需要改变周围的东西时,让经验不足和勤奋的人遭受他们自己造成的伤害?

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

最佳答案

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

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

关于c - 区分 C 中特定于实现的类型和变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16939811/

相关文章:

Java 接口(interface)/实现命名约定

c++ - C++ 中的父子关系

java - 静态变量是否继承

转换错误,IO C 程序

java - 我应该如何命名 java.util.Map?

c - 文件写入C困惑

programming-languages - 为什么我们在变量名中使用 _?

java - 隐藏更改器(mutator),需要澄清

c - 无效使用灵活数组 - 灵活结构数组作为另一个结构的成员

c - 在 Keil uVision 中使用 STM32F429 探索板的 IIR 低通滤波器