标准做法是传递额外的void *以及C回调

时间:2013-10-20 20:41:23

标签: python c binding callback

我需要帮助说服第三方软件供应商更改其API以将一些用户数据传递给回调。

这似乎是一种标准做法,因为我经常在使用回调的地方看到它。 我正在寻找一些弹药给他们的开发团队说服他们这样做。

我的理由是我为他们所有的API调用创建了1:1的Python绑定(除了那些进行回调的调用)。 如果他们的API也对用户数据采用了无效*,例如:

SOME_API_register_function(char* name, char* desc, void* callback, void* user_data);

而不是......

SOME_API_register_function(char* name, char* desc, void* callback);

这将使我更容易(甚至可能)为这些函数创建绑定。 我的绑定目前在Cython中,缺乏动态创建有效C回调的能力。 我相信cffi Python库提供了这种能力,但是这些绑定在性能上有点慢,我担心他们正在采取什么样的魔法来解决它....我也不想移植我的绑定

问题是,即使我们向这些软件的客户付费,要让他们甚至承认错误,更不用说提供新功能需要花费很多。我拥有的弹药越多越好。 任何描述为用户数据提供空白*的编程指南,最佳实践等文档都会有所帮助。

1 个答案:

答案 0 :(得分:0)

如果要多次注册相同的函数,则需要user_data字段。在这种情况下,不同的user_data会区分它们。

这在以下几种情况下很有用:

  1. 注册与某个对象有关,并且可能有许多对象(例如打开的文件)。您不希望每个打开的文件都有单独的功能。

  2. 您希望在几个已注册的函数中执行基本相同的操作,并且可以使用某些值(例如数字常量)表示差异。在这种情况下,多次注册相同的函数很有用,user_data包含不同的值。

  3. P.S。 void *callback是一个糟糕的定义。该类型应定义回调的参数和返回类型(最好使用typedef)。