C 何时使用回调函数?

C 何时使用回调函数?,c,callback,C,Callback,什么时候使用回调函数?我知道它们是如何工作的,我见过它们在使用中,我自己也使用过很多次 C世界的一个例子是libcurl,它依赖回调进行数据检索 一个相反的例子是OpenSSL:在我使用它的地方,我使用out参数: ret = somefunc(&target_value); if(ret != 0) //error case 我想知道什么时候用哪个?回调是否仅对异步内容有用?我目前正在设计应用程序的API,我想知道是使用回调还是只使用out参数。在后台,它将使用libcurl

什么时候使用回调函数?我知道它们是如何工作的,我见过它们在使用中,我自己也使用过很多次

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

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

ret = somefunc(&target_value);
if(ret != 0)
    //error case
我想知道什么时候用哪个?回调是否仅对异步内容有用?我目前正在设计应用程序的API,我想知道是使用回调还是只使用out参数。在后台,它将使用libcurl和OpenSSL作为它构建的主要库,参数“returned”是一个OpenSSL数据类型


我不认为回电话比回来有什么好处。如果我想以任何方式处理数据,而不是仅仅返回数据,那么这是否只是有用的?但是我可以处理返回的数据。差异在哪里?

如果可以立即返回值,则是,不需要回调。正如您所猜测的,回调在无论什么原因都无法立即返回值的情况下非常有用(可能只是一个长时间运行的操作,最好异步执行)。

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

因此,总结一下,这是我遇到的和/或实现回调方案的两个主要范例:

  • 我会在数据到达或某个事件发生时告诉您-您可以根据需要使用它
  • 在我处理之前,我会给你机会修改一些数据

  • 在最简单的情况下,这两种方法是等效的。但是,如果可以多次调用回调来处理到达的数据,那么回调方法提供了更大的灵活性,并且这种灵活性不限于异步用例

    libcurl就是一个很好的例子:它提供了一个API,允许为所有新到达的数据指定回调。正如您所介绍的,另一种方法是只返回数据。但是如何归还呢?如果将数据收集到内存缓冲区中,缓冲区可能会非常大,调用方可能只想将其保存到文件中,就像下载程序一样。如果数据被保存到一个文件中,而该文件的名称被返回给调用者,那么如果调用者实际上只想将数据存储在内存中(如显示图像的web浏览器),则可能会产生不必要的IO。如果调用方希望在数据流中处理数据,比如计算校验和,并且根本不需要存储数据,那么这两种方法都是次优的

    回调方法允许调用方决定如何处理单个数据块或将其组装成一个更大的整体