将Nim Anon函数导出为C ++

时间:2018-03-02 05:03:28

标签: c++ ffi nim nimrod

我试图从C ++调用Nim代码。具体来说,是一个采用匿名函数的函数。

我在Nim中有以下代码:

proc test*(a: proc()) {.exportc.} = a()

我编译为静态库。然后我将它链接到我的C ++可执行文件并尝试使用

定义函数
extern "C" test(void a(void);

并用

调用它
void anon() { printf("hello"); }
...
test(anon)

一切都很好,但是当我运行程序时,它会崩溃。

1 个答案:

答案 0 :(得分:3)

默认情况下,Nim会将匿名proc类型编译为由一对C函数指针和一个void结构表示的闭包,该指针指向一个包含闭包捕获的所有局部变量的结构。在生成的代码中它将如下所示:

typedef struct {
N_NIMCALL_PTR(void, ClP_0) (void* ClE_0);
void* ClE_0;
} tyProc_XXXXXX;

所以,要解决这个问题,你必须修改extern" C"在C代码中定义测试函数以接受兼容的结构类型。或者,您可以通过将cdecl pragma添加到proc类型,让Nim将proc参数编译为常规C函数:

proc test*(a: proc() {.cdecl.}) {.exportc.} = a()

有关Nim支持的调用约定的完整列表,请查看Nim manual中有关proc类型的部分。