我發現有兩個調用約定使用GHC's FFI:ccall
和capi
。文件沒有關於這兩個公約的很多信息。他們之間有什麼區別,我應該什麼時候使用每一個?一個比另一個快嗎?ccall和capi FFI調用約定之間的區別
5
A
回答
6
ccall
是正常的方式。它通過直接鏈接到(通常用C語言編寫的)庫中定義的符號來工作。
capi
是一個ghc擴展,適用於C源代碼級別。這就是爲什麼它可以訪問在ABI級別不存在的東西,比如宏。 (我不知道它是如何實現的,但我想它會生成一個小的C函數包裝器,然後在後臺使用C編譯器編譯它。)
我會盡可能使用ccall
。這是語言標準的一部分,一般看起來不那麼「神奇」。
+6
你有什麼具體的理由喜歡'ccall'而不是'capi'嗎? C庫通常由它們的API定義,而不是ABI,使用'ccall'通常會導致在移植到異常平臺(如Android)時出現問題,這些平臺選擇使用'capi'輕鬆避免的某些函數。我從來沒有遇到過在ccall上使用capi的問題(儘管這可能只是因爲人們很少首先使用capi)。 –
相關問題
- 1. 球拍FFI中_ptr,_pointer和_cpointer之間的區別
- 2. BEM和SUIT之間的區別CSS命名約定
- 3. 綁定和綁定之間的區別
- 4. 綁定,應用和調用方法之間的區別?
- 5. 調試和發佈之間的區別
- 6. Rails中外鍵約束和引用之間的區別
- 7. window.scrollbar和特定frame.scrollbar之間的區別
- 8. 鎖定和互鎖之間的區別
- 9. 定義和聲明之間的區別
- 10. render_template和重定向之間的區別?
- 11. 之間的〜/和的區別../
- 12. '#','%'和'$'之間的區別
- 13. {!!之間的區別!!}和{{}}
- 14. '+ ='和'= +'之間的區別?
- 15. 「。+」和「。+?」之間的區別
- 16. .eq之間的區別。和==
- 17. #。/和#之間的區別。 ./
- 18. !=和!之間的區別==
- 19. 「%〜dp0」和「。\」之間的區別?
- 20. | =和^ = css之間的區別
- 21. 之間的區別。和#
- 22. ==和case之間的區別?
- 23. 「**/* /」和「** /」之間的區別?
- 24. jQuery - '。'之間的區別和「#」
- 25. 「?1」和「?」之間的區別
- 26. `%in%`和`==`之間的區別
- 27. fmod和%之間的區別
- 28. 之間的區別:+和:+
- 29. 調用$這與否之間的區別
- 30. SQL中的約束和規則之間的區別
我點擊了鏈接,可能只是說新的GHC文檔看起來非常棒! – epsilonhalbe
我認爲區別在於導入純文本文件和頭文件,但這只是猜測,實際上我從來沒有使用過FFI。 – epsilonhalbe