我需要帮助说服第 3 方软件供应商更改他们的 API 以将一些用户数据传递给回调。
这似乎是一种标准做法,因为我经常在使用回调的地方看到它。 我正在寻找一些弹药给他们的开发团队来说服他们这样做。
我的理由是我已经为他们的所有 API 调用创建了 1:1 的 Python 绑定(bind)(接受回调的调用除外)。 如果他们的 API 也为用户数据取了一个 void*...例如:
SOME_API_register_function(char* name, char* desc, void* callback, void* user_data);
而不是...
SOME_API_register_function(char* name, char* desc, void* callback);
这将使我更容易(甚至可能)为这些函数创建绑定(bind)。 我的绑定(bind)目前在 Cython 中,它缺乏动态创建有效 C 回调的能力。 我相信 cffi Python 库提供了这种能力,但这些绑定(bind)的性能有点慢,我担心他们正在做的那种魔法来实现它……我也不想移植我的绑定(bind).
问题是,即使我们向该软件的客户付费,也需要很多时间才能让他们承认错误,更不用说提供新功能了。我拥有的弹药越多越好。 任何说明为用户数据提供 void* 的编程指南、最佳实践等文档都会有所帮助。
最佳答案
user_data
字段是需要多次注册同一个函数的。在这种情况下,不同的 user_data
可以区分它们。
这在几种情况下很有用:
注册与某些对象相关,并且可能有很多对象(例如打开的文件)。您不希望每个打开的文件都有一个单独的函数。
您想在几个已注册的函数中做基本相同的事情,并且可以用一些值(例如数字常量)来表示差异。在这种情况下,多次注册相同的函数并让
user_data
包含不同的值是很有用的。
附言void *callback
是一个错误的定义。该类型应定义回调的参数和返回类型(最好使用 typedef
)。
关于python - 将额外的 void* 与 C 回调一起传递是标准做法吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19482630/