【发布时间】:2015-12-16 10:37:40
【问题描述】:
C 中一个相当常见的习惯用法是,函数采用多态闭包将其表示为两个参数,一个函数指针和一个 void 指针(作为参数之一传递给函数指针。
取自GPGME 库的示例:
typedef gpgme_error_t (*gpgme_passphrase_cb_t) (void *hook,
const char *uid_hint,
const char *passphrase_info,
int prev_was_bad,
int fd);
void gpgme_set_passphrase_cb (gpgme_ctx_t ctx,
gpgme_passphrase_cb_t cb,
void *hook_value);
从概念上讲,函数指针加上 void 指针表示与 C# 中的委托(闭包)相同的东西。在进行此类 P/Invoke 调用时,是否有一种很好的规范方式来编组委托?
【问题讨论】:
-
小心,让委托对象保持活动状态是您的工作。将其存储在静态变量中,这样就不会过早地进行垃圾收集。仅当您确定 C 代码无法再进行回调时,才将变量设置回 null。