API返回一个结构

时间:2013-08-13 09:51:18

标签: c api struct

什么是最佳解决方案:

  • 我们的API向用户返回结构
  • 我们希望用户能够阅读其内容
  • 我们不希望用户更改它,因为它可能会被传递给其他API函数并且其内容应该是正确的?

6 个答案:

答案 0 :(得分:3)

而不是返回一个结构返回一些东西,让你恢复结构(指向结构的指针应该工作,但你可以使用其他东西)而不是让用户访问其字段,给他一组函数(或宏) )用于访问这些字段。

我认为这称为不透明指针。

答案 1 :(得分:2)

如果您不希望用户弄乱结构内部,则可以返回只能使用您定义的访问器函数读取的opaque pointer

答案 2 :(得分:2)

您的函数可以返回指向const结构的指针。然后:

  • 不允许调用者通过指向const结构的指针修改结构。 C实现应该强制执行此规则。
  • 如果调用者将指向const结构的指针传递给API中的另一个函数,则C规则允许该函数将指向const结构的指针转换为指向非const结构的指针。如果结构不是定义是const(例如,它被创建为非const,但指向它的指针被转换为指向const结构的指针),则允许该函数修改通过新转换的指针到非const结构的结构。
  • C规则还允许调用者进行相同的转换和修改。显然,来电者不应该这样做,你依靠他们的善意不会这样做。因此,此技术可防止通过返回的指针进行无意修改,但不会阻止通过转换指针进行恶意修改。

除此之外,您可以仅为调用者提供结构的不完整声明,仅显示其名称(如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

PS:我在我的命令中说出了第三个建议,然后我得到了一个downvote,而我看到其他人将这个添加到他的答案中并得到一个upvote,我们都没有先行,如何发生这种情况!