在 go 中调用 c 函数时, 函数参数因为使用 typedef 定义 void *的类型别名定义函数参数时, 传参不匹配问题

package main
/*
#include <stdio.h>
//c中的别名定义
typedef void * handle;
//c函数,参数为一个二级指针
void func1(handle *p)
{
     int **temp = (int **)p;
     printf("vaule is : %d\r\n", **temp);
    **temp = 600;
    if(p != NULL)
    { 
        int **num = (int **)p;
        printf("test ok! , %d\r\n", **num); 
    }
}
*/
import "C"
import (
    "fmt"
     "unsafe"
)

func main(){

    var model int = 500
    var cModels uintptr
    cModels = uintptr(unsafe.Pointer(&model))
    p := (*unsafe.Pointer)(unsafe.Pointer(&cModels))
    C.func1(p)            //因为在c函数中使用了别名定义参数类型,
                            //这里传参会产生类型不匹配的错误.错误如下.
    a := *(*int)(unsafe.Pointer(uintptr(*p)))
    println("a", a)
}

func1(void **p){}这样定义时,上面的C.func1(p)调用是没错的,当func1(handle *p){}改成这样定义时,便会产生如下的错误:
ERROR : cannot use _cgo0 (type *unsafe.Pointer) as type *_Ctype_hand in argument to _Cfunc_func1
这个错误发生的原因是什么呢?请大家了解的可以指导下.谢谢了!

讨论数量: 1
Summer
4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!