什么是最佳解决方案:
答案 0 :(得分:3)
而不是返回一个结构返回一些东西,让你恢复结构(指向结构的指针应该工作,但你可以使用其他东西)而不是让用户访问其字段,给他一组函数(或宏) )用于访问这些字段。
我认为这称为不透明指针。
答案 1 :(得分:2)
如果您不希望用户弄乱结构内部,则可以返回只能使用您定义的访问器函数读取的opaque pointer。
答案 2 :(得分:2)
您的函数可以返回指向const结构的指针。然后:
除此之外,您可以仅为调用者提供结构的不完整声明,仅显示其名称(如struct foo;
中)并且不定义其内容(如{{1 }})。当调用者只有一个结构的不完整声明时,他们可以接收一个指向结构的指针,并且可以存储它并将其作为参数传递,但是他们不能使用它来访问结构(除非通过异常方式,例如转换它指向另一种类型的指针或通过提供自己的结构定义。)
如果调用者只有一个不完整的结构声明但必须能够使用结构的内容,则必须提供其他函数,这些函数接受指向结构的指针作为参数并从结构内部返回信息。 / p>
答案 3 :(得分:1)
您无法阻止用户访问结构内容。如果这是一个要求,您将不得不返回一个不透明的值并添加一个API来获取其中一个不透明值并从中返回单个值。
答案 4 :(得分:1)
要扩展此处的答案,建议使用不透明的struct
:
在C中,很少有方法可以阻止人们访问您的数据。如果您将structs
作为参数并返回公共API的值,则有一些方法可以隐藏数据,或者合同要求用户不要访问所述数据。
不透明struct
的最常见用法可能是<stdio.h>
FILE *
。只要您使用标准库读取/写入/查询文件,只需将struct FILE *
传递给其中一个libc I / O函数,例如fwrite
。查看结构会导致未定义的行为,因为它不能保证跨平台的相同实现。
如果您希望用户能够修改某些数据而不修改其他数据,则可以执行以下操作:
typedef struct
{
void * _my_private_data; //KEEP OUT
char * name;
int count;
//etc
}my_api_type;
然后,您可以定义向您的用户公开的所有函数调用的第一个参数,以获取其中一个structs
:
my_api_type set_internal_flag(my_api_type * obj, int flag);
确保您的私人数据保持隐藏状态后,您的实施可以保证无论您如何定义void *
背后的结构,您的API函数都可以在规范更改中保持兼容,并且用户无需修改当事情得到更新时,他们的代码。
答案 5 :(得分:0)
我认为每次使用调用此函数,您都可以复制此结构并返回要使用的副本。
这样,每次调用函数时,都会创建一个新副本。
Aslo,您可以让用户malloc
为memeory并为API提供地址,API只需使用memset
填充地址,这样用户可以在完成数据使用后释放内存。 / p>
如果您不想在任何地方存储结构,也可以使用opaque pointer
。