我试图从C ++调用Nim代码。具体来说,是一个采用匿名函数的函数。
我在Nim中有以下代码:
proc test*(a: proc()) {.exportc.} = a()
我编译为静态库。然后我将它链接到我的C ++可执行文件并尝试使用
定义函数extern "C" test(void a(void);
并用
调用它void anon() { printf("hello"); }
...
test(anon)
一切都很好,但是当我运行程序时,它会崩溃。
答案 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类型的部分。