你想要一个CString
.
从CString
to String
:
peekCString :: CString -> IO String
从String
to CString
:
withCString :: String -> (CString -> IO a) -> IO a
还有 Haddock 文档module Foreign.C.String http://hackage.haskell.org/packages/archive/base/latest/doc/html/Foreign-C-String.html.
可以使用的类型的一般列表foreign
声明被指定为一部分Haskell 报告中的外部函数接口 http://www.haskell.org/onlinereport/haskell2010/haskellch8.html#x15-1490008.
Edit
好的,这是您可以执行的操作的一个非常小的示例,在某种程度上基于您的示例代码。创建 Haskell 文件CTest.hs
包含以下内容:
module CTest where
import Foreign.C
hello :: IO CString
hello = newCString "hello"
foreign export ccall hello :: IO CString
然后创建一个C文件ctest.c
包含以下内容:
#include <stdio.h>
#include "CTest_stub.h"
int main (int argc, char *argv[]) {
hs_init(&argc, &argv);
printf("%s\n", hello());
hs_exit();
return 0;
}
然后编译运行如下:
$ ghc CTest
[1 of 1] Compiling CTest ( CTest.hs, CTest.o )
$ ghc -o ctest ctest.c CTest.o -no-hs-main
$ ./ctest
hello