ccall 和 capi FFI 调用约定之间的区别

Difference between ccall and capi FFI calling conventions

我发现使用 GHC's FFI 有两个调用约定:ccallcapi。文档没有太多关于这两个约定的信息。它们之间有什么区别,我应该什么时候使用它们?一个比另一个快吗?

ccall 是正常的方式。它通过直接链接在(通常用 C 编写的)库中定义的符号来工作。

capi 是一个适用于 C 源代码级别的 ghc 扩展。这就是为什么它可以访问在 ABI 级别不存在的东西,例如宏。 (我不知道它是如何实现的,但我猜它会生成一个小的 C 函数包装器,然后在幕后使用 C 编译器对其进行编译。)

我会尽可能使用 ccall。它是语言标准的一部分,总体上看起来不那么 "magical"。