C API应该返回值还是错误代码?

gra*_*olf 3 c api-design

我正在写我的第一个C库,我不知道该走哪条路.例如,从某些数据存储中检索字符串值的函数可以是:

int get_value(void * store, char ** result);
Run Code Online (Sandbox Code Playgroud)

要么

char * get_value(void * store, int * error);
Run Code Online (Sandbox Code Playgroud)

我很难有任何客观的理由偏爱一个人而不是另一个人,但不止于此,我不会写那么多C.当存在多个输出参数时,返回错误代码看起来会更加一致,但返回值可能更容易使用?不确定.

关于哪种风格更好以及为什么或仅仅是个人偏好,是否存在普遍共识?

Ste*_*mit 7

对于像这样的基于风格的问题,往往没有好的,"硬"的答案.以下是我的意见; 其他人会不同意.

  • 让函数简单地返回其返回值通常会使调用者更容易 - 只要调用者有兴趣获得答案,而不一定是最佳错误处理.

  • 让所有函数返回成功/失败代码 - 通过"结果"参数返回任何其他数据 - 可以实现干净和一致的错误处理,但对于调用者来说往往不太方便.您总是需要声明额外的变量(正确的类型)来保存返回值.你不一定能写出类似的东西a = f(g());.

  • 通常返回普通值,并通过"带外"普通返回值指示错误,是一种流行的技术 - 规范示例是标准C getchar函数 - 但它可以感觉相当临时且容易出错.

  • 通过返回值返回值,并通过"返回"参数返回错误代码是不常见的.我可以看到吸引力,但我不能说我曾经使用过那种技术,或者说.如果需要有一个与返回值不同的错误返回,那么"C方式"(当然这通常是一个非常糟糕的主意,现在非常强烈地弃用)是使用某种全局变量,àla errno.

  • 如果你想要注意原来的"C精神",这对于程序员来说非常方便,并且不太担心严格的一致性,并且通常可以保持健康的不一致和无所不在.因此,使用带外错误返回很好.

  • 如果你想要注意现代用法,它似乎越来越倾向于整合和正确,这意味着一致的错误返回方案是一件好事,即使它们不太方便.因此,返回值是成功/失败代码,结果参数返回的数据是正常的.

  • 如果你想让返回值成为返回值,为了方便,如果错误是不寻常的,但是对于那些关心你想要给他们一种获得细粒度错误信息的方法的调用者来说,有时候会有一个很好的折衷方案.一个单独的函数,用于获取最新错误的详细信息.这仍然可以导致与全局变量相同的竞争条件,但是如果您的库使用某种"描述符"或"句柄",那么您可以安排使用此错误详细信息函数返回最详细的信息最近对特定手柄的操作,它可以很好地工作.