外部函式介面
雖然 cabal 支援在 Haskell 包中包含 C 和 C++庫,但是存在一些錯誤。首先,如果你在 b.o
中使用 b.o
中定義的資料(而不是函式),並列出 C-sources: a.c, b.c
,那麼 cabal 將無法找到資料。這在 #12152 中有記錄 。使用 cabal 時的解決方法是將 C-sources
列表重新排序為 C-sources: b.c, a.c
。這在使用堆疊時可能不起作用,因為堆疊始終按字母順序連結 C-sources
,無論你列出它們的順序如何。
另一個問題是你必須用 #ifdef __cplusplus
警衛包圍標頭檔案(.h)中的任何 C++程式碼。這是因為 GHC 不理解標頭檔案中的 C++程式碼。你仍然可以在標頭檔案中編寫 C++程式碼,但是你必須用守衛包圍它。
ccall
指的是呼召慣例 ; 目前支援 ccall
和 stdcall
(Pascal 慣例)。unsafe
關鍵字是可選的; 這減少了簡單函式的開銷,但是如果外部函式無限期地阻塞或者沒有足夠的許可權來執行 1, 則可能導致死鎖。