在Racket的FFI中_ptr,_pointer和_cpointer之间的区别

时间:2017-05-25 17:41:16

标签: pointers racket ffi

Racket FFI的文档包含_ptr_cpointer_pointer的类型。 1

然而,文档(撰写此问题时)似乎并没有比较三种不同的类型。显然前两个是产生validate(req.body) .catch(e => { throw new APIError(400, e); }) .then(validatedbody => searchdatabase(validatedbody) .then(validate) .catch(e => { throw new APIError(500, e); }) ) .then(validatedDbResult => res.json(validatedDbResult), next) s的函数,其中最后一个是ctype?本身。但是我什么时候会使用另一种类型呢?

1 它还有其他类型,例如ctype?_box_list_gcpointer。这些都是这三个函数的变体。

1 个答案:

答案 0 :(得分:3)

  • _ptr是一个宏,用于创建适合于函数类型的类型,在这些函数类型中,您需要通过作为参数传递的指针传递数据(C中非常常见的习语)。 / p>

  • _pointer是一个通用指针ctype,可以在预期或返回指针的任何地方使用。在Racket方面,它变为不透明的值,您无法轻易操作(如果需要,可以使用ptr-ref)。请注意,使用此文档时,文档有一些关于与GC交互的注意事项。

  • _cpointer构建更安全的_pointer变体,它们使用标记来确保您不会混淆不同类型的指针。使用define-cpointer-type而不是手动构建这些通常会更方便。换句话说,这些可以帮助您构建由Racket的C指针表示的抽象。您可以使用cpointer-push-tag!_pointer手动执行此操作,但这样做不太方便。

我还写了一篇博文,详细介绍了其中一些指针问题:http://prl.ccs.neu.edu/blog/2016/06/27/tutorial-using-racket-s-ffi/