我需要帮助说服第三方软件供应商更改其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库提供了这种能力,但是这些绑定在性能上有点慢,我担心他们正在采取什么样的魔法来解决它....我也不想移植我的绑定
问题是,即使我们向这些软件的客户付费,要让他们甚至承认错误,更不用说提供新功能需要花费很多。我拥有的弹药越多越好。 任何描述为用户数据提供空白*的编程指南,最佳实践等文档都会有所帮助。
答案 0 :(得分:0)
如果要多次注册相同的函数,则需要user_data
字段。在这种情况下,不同的user_data
会区分它们。
这在以下几种情况下很有用:
注册与某个对象有关,并且可能有许多对象(例如打开的文件)。您不希望每个打开的文件都有单独的功能。
您希望在几个已注册的函数中执行基本相同的操作,并且可以使用某些值(例如数字常量)表示差异。在这种情况下,多次注册相同的函数很有用,user_data
包含不同的值。
P.S。 void *callback
是一个糟糕的定义。该类型应定义回调的参数和返回类型(最好使用typedef
)。