我正在用C开发一个简单的库,供我自己+一些朋友个人使用。
我目前有一个C结构,其中一些成员应该以某种方式隐藏在应用程序的其余部分,因为它们的使用只是内部的。偶然修改其中一个成员可能会使图书馆“疯狂”。
是否有任何“解决方法”隐藏这些成员以使其无法访问?
答案 0 :(得分:15)
通常的技术是:
/* foo.h */
typedef struct Foo Foo;
Foo *foo_create(...);
void foo_bark(Foo* foo, double loudness);
/* foo.c */
struct Foo {
int private_var;
};
您可以通过在标题中定义Foo并在.c文件中定义FooPrivate来部分隐藏数据成员:
struct FooPrivate {
Foo public_stuff;
int private_var;
}
但是你的实现必须在Foo和FooPrivate之间来回转换,我觉得这是一个皇家PITA,如果你以后改变主意并希望私有化,那将是一个维护负担。除非你想从代码中抽出每个最后一个CPU周期,否则只需使用访问器函数。
答案 1 :(得分:2)
马塞洛·坎托斯已经给你答案了。有关更多详细信息,您应该了解如何在大多数uderlying库中有效隐藏FILE结构。
您会注意到FILE结构本身永远不会对用户可用,只有接口和Opaque FILE *可供我们使用。
答案 2 :(得分:1)
基本上,我们的想法是用类似哈希的方式重命名结构的变量 并编写函数(可以在OO语言中使用各种模仿方法)来访问它们。 理想情况下,你应该在结构中有这些函数的函数指针,所以你不需要 必须调用外部函数并传递给你想要添加的成员。 但是,不知道函数指针语法是最漂亮的。 一个简单的例子可以澄清Marcelo之前的说法:
struct Car {
int _size;
char _colour[10];
};
typedef struct Car Car;
int main (int argc, char **argv) {
Car *myCar= malloc(sizeof(Car));
myCar->_size=5; /* accessing it directly just to set up a value, you shold have an
accessor function really */
printf("car size is: %i \n",getCarSize(myCar));
free(myCar);
}
int getCarSize(Car *myCar) {
return myCar->_size;
}
答案 3 :(得分:1)
我同意Marcelo Cantos,但也建议在“公共”结构中添加一个指针,指向“私人”内容,即:
/* foo.h */
typedef struct Bar Bar;
typedef struct Foo
{
int public;
Bar* private;
} Foo;
Foo *foo_create(...);
void foo_bark(Foo* foo, double loudness);
/* foo.c */
struct Bar
{
int private_var;
};
这种方法有点像“pimpl”的意思。迄今为止最简单的方法是做Marcelo Cantos所建议的。