2016-06-07 38 views
5

我發現有兩個調用約定使用GHC's FFIccallcapi。文件沒有關於這兩個公約的很多信息。他們之間有什麼區別,我應該什麼時候使用每一個?一個比另一個快嗎?ccall和capi FFI調用約定之間的區別

+2

我點擊了鏈接,可能只是說新的GHC文檔看起來非常棒! – epsilonhalbe

+1

我認爲區別在於導入純文本文件和頭文件,但這只是猜測,實際上我從來沒有使用過FFI。 – epsilonhalbe

回答

6

ccall是正常的方式。它通過直接鏈接到(通常用C語言編寫的)庫中定義的符號來工作。

capi是一個ghc擴展,適用於C源代碼級別。這就是爲什麼它可以訪問在ABI級別不存在的東西,比如宏。 (我不知道它是如何實現的,但我想它會生成一個小的C函數包裝器,然後在後臺使用C編譯器編譯它。)

我會盡可能使用ccall。這是語言標準的一部分,一般看起來不那麼「神奇」。

+6

你有什麼具體的理由喜歡'ccall'而不是'capi'嗎? C庫通常由它們的API定義,而不是ABI,使用'ccall'通常會導致在移植到異常平臺(如Android)時出現問題,這些平臺選擇使用'capi'輕鬆避免的某些函數。我從來沒有遇到過在ccall上使用capi的問題(儘管這可能只是因爲人們很少首先使用capi)。 –