gpt4 book ai didi

Racket FFI : C function which accepts a pointer to a function

转载 作者:行者123 更新时间:2023-12-04 23:55:27 26 4
gpt4 key购买 nike

我想绑定(bind)一个 C 函数 abc其签名是:

int abc(void (*)(int))

IE。它接受一个指向函数的指针。此回调接受 int并且有 void返回类型。

Racket 中的正确咒语是什么?

最佳答案

这是一个类似绑定(bind)的示例:假设我们要绑定(bind)一个函数 callTwice签名:

int callTwice(int (*)(int));

并使用愚蠢的 C 实现:
int callTwice(int (*f)(int)) {
return f(f(42));
}

这是 Racket FFI 绑定(bind)的样子:
(define call-twice (get-ffi-obj "callTwice" the-lib
(_fun (_fun _int -> _int) -> _int)))

在哪里 the-lib是我们从 ffi-lib 获得的 FFI 绑定(bind)库.在这里,我们看到 call-twice 的第一个参数本身就是一个 (_fun _int -> _int) ,这是我们在我的示例中想要的函数指针类型。

这意味着从技术上讲,我们可以这样写:
(define _mycallback (_fun _int -> _int))

(define call-twice (get-ffi-obj "callTwice" the-lib
(_fun _mycallback -> _int)))

为了更容易看到 call-twice接受一个回调作为它的唯一参数。对于您的情况,您可能需要 (_fun _int -> _void)为您的回调类型的值。

完整的例子可以在这里找到: https://github.com/dyoo/ffi-tutorial/tree/master/ffi/tutorial/examples/call-twice .运行 pre-installer.rkt在该目录中构建扩展,然后通过运行 test-call-twice.rkt 对其进行测试.

关于 Racket FFI : C function which accepts a pointer to a function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16994644/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com