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

cro*_*eea 5 haskell ffi

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

mel*_*ene 6

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

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

我会ccall尽可能使用.它是语言标准的一部分,看起来不那么"神奇".

  • 你有什么具体的理由喜欢'ccall`而不是'capi`吗?C库通常由它们的API定义,而不是ABI,并且使用`ccall`经常在移植到异国平台(例如Android)时导致问题,这些平台选择将某些功能实现为可以通过使用`capi`轻松避免的宏.我从来没有遇到过使用`capi`而不是'ccall`引起的问题(虽然这可能只是因为人们很少首先使用'capi`). (6认同)