何时使用回拨功能?

时间:2013-04-14 21:51:45

标签: c callback

什么时候使用回调功能?我知道它们是如何工作的,我已经看到它们在使用中,我已经多次使用它们了。

来自C世界的一个例子是libcurl,它依赖于回调来进行数据检索。

一个相反的例子是OpenSSL:在我使用它的地方,我使用了参数:

ret = somefunc(&target_value);
if(ret != 0)
    //error case

我想知道何时使用哪个?回调只对异步内容有用吗?我目前正在设计我的应用程序的API,我想知道是使用回调还是只是一个out参数。在引擎盖下,它将使用libcurl和OpenSSL作为它构建的主库,参数“返回”是一个OpenSSL数据类型。

我认为回调不会带来任何好处。这只是有用的,如果我想以任何方式处理数据而不是仅仅回馈它?但后来我可以处理返回的数据。区别在哪里?

3 个答案:

答案 0 :(得分:4)

在最简单的情况下,这两种方法是等价的。但是,如果可以多次调用回调来处理数据,那么回调方法可以提供更大的灵活性。

libcurl就是一个很好的例子:它提供了一个API,允许为所有新到达的数据指定回调。如您所示,替代方案是返回数据。但是回归 - 怎么样?如果数据附加到内存缓冲区,它可能会非常大,调用者可能只想将其保存到文件中。如果数据保存到返回给调用者的文件中,如果调用者实际上只想将其存储在内存中,则可能会产生不必要的I / O.如果调用者只想计算校验和,并且根本不需要存储数据,则任何一种方法都是错误的。

回调方法允许调用者决定如何将基本数据块组合成更大的整体。

答案 1 :(得分:3)

回调对异步通知很有用。当您使用某些API注册回调时,您希望在发生某些事件时运行回调。同样,您可以将它们用作数据处理管道中的中间步骤(如果您熟悉音频/录音行业,则类似于'插入')。

总而言之,这些是我遇到的两个主要范例和/或实现了回调方案:

  1. 我会在数据到达或某些事件发生时告诉您 - 您可以按照自己的意愿使用它。
  2. 在处理之前,我会给你机会修改一些数据。

答案 2 :(得分:0)

如果可以立即返回值,则返回yes,不需要回调。正如您所推测的那样,回调在某些情况下非常有用,因为无论出于何种原因,都不能立即返回(也许它只是一个长时间运行的操作,最好是异步执行)。