传递给 Go 的 C 引用无法识别 typedef void*?

C references passed to Go can not recognize typedef void*?

c.h

typedef void*       MVar;

C_FUNC(
    MVar*     myvar   //[out], return value
)

test.go

var cvar unsafe.Pointer

_ = C.C_FUNC(&cvar)

当我运行test.go时,它告诉我

cannot use _cgo5 (type *unsafe.Pointer) as type *_Ctype_MVar 
in argument to _Cfunc_C_FUNC

在本文档Command cgo: Go references to C中,它表示"The C type void* is represented by Go's unsafe.Pointer."

cannot use _cgo5 (type *unsafe.Pointer) as type *_Ctype_MVar 
in argument to _Cfunc_C_FUNC

Go 工具链提示您的类型不匹配。


一个等效的工作示例,具有匹配的类型,

package main

import (
    "fmt"
    "unsafe"
)

/*
typedef void* pv_t;
void cfunc(pv_t *p);

#include <stdio.h>
int i;
void cfunc(pv_t *p) {
    i = 42;
    *p = &i;
    printf("%p %p %d\n", p, *p, *(int*)(*p));
}
*/
import "C"

func main() {
    var cptr unsafe.Pointer
    C.cfunc((*C.pv_t)(&cptr))

    fmt.Println(&cptr, cptr, *(*C.int)(cptr))
}

输出:

$ go run so.go
0xc000010028 0x592d18 42
0xc000010028 0x592d18 42
$