传递一个额外的void*和C回调是标准做法吗

2024-04-29 22:12:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要帮助说服第三方软件供应商改变他们的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库提供了这一功能,但是这些绑定在性能上有点慢,我担心它们会有什么魔力来实现它。。。。我也不想移植我的绑定。你知道吗

问题是,尽管我们向这个软件的客户付费,但要让他们承认错误需要花费很多时间,更不用说提供新的功能了。我的弹药越多越好。 任何关于编程指南、最佳实践等的文档,如果说为用户数据提供一个空白*都是有帮助的。你知道吗


Tags: 数据用户name功能registerapi软件callback
1条回答
网友
1楼 · 发布于 2024-04-29 22:12:12

如果要多次注册同一函数,则需要user_data字段。在这种情况下,不同的user_data将区分它们。你知道吗

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

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

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

p.S.void *callback是个错误的定义。类型应该定义回调的参数和返回类型(最好使用typedef)。你知道吗

相关问题 更多 >