我正在尝试调用C ++函数:
void TestFunc(void(*f)(void)) { f(); }
从Go Code。
我真的希望它只是将Go函数传递给该函数。我知道我可以将其包装到一个类中,并使用%feature(“ director”)解决它,但这并不是我的最佳解决方案。
从我在本页中看到的内容来看,Go中的函数指针应与C ++中的相同,因此我尝试了以下.swig文件:
%{
#include "test.h"
%}
%typemap(gotype) FUNC* "func()"
%typemap(in) FUNC* {
$1 = (void(*)(void))$input;
}
%apply FUNC* { void(*)(void) };
%include "test.h"
我很惊讶它最初会起作用,但是后来发现它并不总是起作用:(。
例如,在此Go代码中,它可以按预期工作:
import "fmt"
import "test_wrap"
func main() {
b := false
test_wrap.TestFunc(func() { b = true })
fmt.Println(b) // This actually DOES print "true"!
}
但是在其他情况下,它不起作用。例如,在这里:
import "fmt"
import "test_wrap"
func main() {
test_wrap.TestFunc(func() { fmt.Println("SUCCESS") })
fmt.Println("Done")
}
我实际上得到:
SUCCESS
SIGILL: illegal instruction
PC=0x4c20005d000
goroutine 1 [syscall]:
test_wrap._swig_wrap_TestFunc(0x400cb0, 0x400c2a)
base_go_test__wrap_gc.c:33 +0x32
test_wrap.TestFunc(0x400cb0, 0x2)
base_go_test__wrap.go:37 +0x25
main.main()
test.go:8 +0x2a
goroutine 2 [syscall]:
created by runtime.main
go/gc/src/pkg/runtime/proc.c:225
rax 0x0
rbx 0x0
rcx 0x0
rdx 0x8
rdi 0x4c200073050
rsi 0x4c20004c0f0
rbp 0x0
rsp 0x4c20004c100
r8 0x2
r9 0x4b0ae0
r10 0x4f5620
r11 0x4dbb88
r12 0x4f5530
r13 0x7fad5977f9c0
r14 0x0
r15 0x3
rip 0x4c20005d000
rflags 0x10202
cs 0x33
fs 0x0
gs 0x0
请注意,它确实打印了“ SUCCESS”,这意味着函数DID运行了,即使我将更复杂(又长)的代码放入该函数中,它也能完美执行,但并没有返回:(。
请让我知道您的想法,以及如何解决此问题。我不介意在C ++部分上添加一些代码,但我确实希望Go部分看起来“干净”。
翻翻过去那场雪
相关分类