是否有任何解决方法使结构成员在C中以某种方式“私有”?

我正在用C开发一个简单的库,供我自己+一些朋友个人使用。

我目前有一个C结构,其中一些成员应该以某种方式隐藏在应用程序的其余部分,因为它们的使用只是内部的。 偶然修改其中一个成员可能会使图书馆“疯狂”。

是否有任何“解决方法”来隐藏这些成员以使其无法访问?

通常的技术是这样的:

/* 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周期,否则只需使用访问器function。

马塞洛·坎托斯已经给你答案了。 有关更多详细信息,您应该了解如何在大多数uderlying库中有效隐藏FILE结构。

您会注意到FILE结构本身永远不会对用户可用,只有接口和Opaque FILE *可供我们使用。

基本上,我们的想法是将结构的变量重命名为hash和write函数(在OO语言中可以使用mimmic方法)来访问它们。 理想情况下,您应该在结构中具有指向这些函数的函数指针,这样您就不必调用外部函数并将其传递给您希望添加的成员。 但是,不知道函数指针语法是最漂亮的。 一个简单的例子可以澄清马塞洛之前的说法:

 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; } 

我同意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所建议的。