Unable to Call unsafe.Pointer(Pointed to C Function) as Function

偶尔善良 提交于 2021-01-28 07:55:13

问题


I'm trying to call C function with same signature they take 2 int arguments. and this error cannot call non-function f (type unsafe.Pointer) appear during compile.

package main

/*
int add(int a, int b) {
  return a+b;
}
int sub(int a, int b) {
  return a-b;
}
*/
import "C"
import (
    "fmt"
    "unsafe"
)

func main() {
    a := C.int(1)
    b := C.int(2)
    fx := make([]unsafe.Pointer, 2)
    fx[0] = C.add
    fx[1] = C.sub
    for _, f := range fx {
        fmt.Printf("Result: %d\n", f(a, b))
    }
}

Now I'm working around with wrap C function with go function and add go function into slice instead like this

package main

/*
int add(int a, int b) {
  return a+b;
}
int sub(int a, int b) {
  return a-b;
}
*/
import "C"
import (
    "fmt"
)

func add(a, b int) int {
    return (int)(C.add(C.int(a), C.int(b)))
}

func sub(a, b int) int {
    return (int)(C.sub(C.int(a), C.int(b)))
}

func main() {
    fx := [](func(int, int) int){
        add, sub,
    }
    for _, f := range fx {
        fmt.Printf("Result: %d\n", f(1, 2))
    }
}

Is there any way to call C function from unsafe.Pointer, I'm using GO 1.8.1 Linux


回答1:


I can solve my problem, according to Go references to C.

Calling C function pointers is currently not supported, however you can declare Go variables which hold C function pointers and pass them back and forth between Go and C. C code may call function pointers received from Go.

It's looks like I have to create a bridge function for call C function pointer

package main

/*
int add(int a, int b) {
  return a+b;
}
int sub(int a, int b) {
  return a-b;
}

typedef int(*math_fp)(int, int);

const int len_operator = 2;

math_fp math_operators[2] = {
    add, sub
};

int do_math(math_fp op, int a, int b) {
    return op(a, b);
}
*/
import "C"
import (
    "fmt"
)

func main() {
    var fnCnt C.int = 2
    var i C.int
    for i = 0; i < fnCnt; i++ {
        op := C.math_fp(C.math_operators[i])
        fmt.Printf("Result: %d\n", C.do_math(op, 1, 2))
    }
}

Return expected result

$ go run src/test.go 
Result: 3  
Result: -1


来源:https://stackoverflow.com/questions/44020148/unable-to-call-unsafe-pointerpointed-to-c-function-as-function

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!