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
。这些都是这三个函数的变体。
答案 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/