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

时间:2013-06-05 12:19:27

标签: c naming-conventions data-hiding

假设有一个接口规范“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,因为它们是特定于实现的细节,并且可能在将来的某些时候发生变化或消失。鉴于我不能通过使用像不透明指针之类的东西来隐藏实现,我该怎么做才能使这些内部成员脱颖而出(或隐藏这些东西的其他技巧)?是否有任何常用/标准的方法来处理这样的问题?我能想到的最好的方法是使用像引导下划线这样的命名约定,但我不确定领先的下划线规则是否适用于成员变量,我觉得我也混淆了一些特定于C ++的规则。我还想过为INTERNAL_dinky_dingbat命名它们或者为X_Fiddle中包含的内部类型设置一个单独的结构,但是我想将额外的输入保持在最低限度,所以我不喜欢它们。或者只是拥有一个如上所述的简单普通结构是完全可以接受的,其中在评论和文档中详细说明了特定于实现的细节,当我需要改变周围的事物时,让经验不足和勤奋的人遭受自己造成的伤害?

假设我从头开始和/或我的公司/团队没有针对此特定案例的约定。

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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