Я пытаюсь вызвать код Nim из C ++. В частности, функция, которая принимает анонимную функцию.
У меня есть следующий код в Nim:
proc test*(a: proc()) {.exportc.} = a()
который я компилирую в статическую библиотеку. Затем я связываю его с моим исполняемым файлом C ++ и пытаюсь определить функцию с помощью
extern "C" test(void a(void);
и позвони с
void anon() { printf("hello"); }
...
test(anon)
Все компилируется нормально, но когда я запускаю программу, она вылетает.
По умолчанию Nim скомпилирует анонимные типы процедур как замыкания, представленные парой указателя на функцию C и пустого указателя на структуру, содержащую все локальные переменные, захваченные замыканием. В сгенерированном коде это будет выглядеть так:
typedef struct {
N_NIMCALL_PTR(void, ClP_0) (void* ClE_0);
void* ClE_0;
} tyProc_XXXXXX;
Таким образом, чтобы решить эту проблему, вы должны изменить внешнее определение «C» тестовой функции в коде C, чтобы принять совместимый тип структуры. Кроме того, вы можете попросить Nim скомпилировать аргумент proc в обычную функцию C, добавив cdecl
Прагма для типа proc:
proc test*(a: proc() {.cdecl.}) {.exportc.} = a()
Полный список соглашений о вызовах, поддерживаемых Nim, можно найти в разделе о типах процедур в Ним руководство.
Других решений пока нет …