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

标签 go cgo


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中,它说:“C类型void *由Go的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
$

关于go - 传递给Go的C引用无法识别typedef void *?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59345750/

相关文章:

go - 将结构和结构数组从 Go 传递给 C 函数

go - 将字符串数组作为参数从 go 传递给 C 函数

objective-c - Golang + cgo - AppDelegate 实现不起作用

go - 返回 double 组的导出函数

gosec 给出 "could not import C (no metadata for C)"golang 错误

Go Gorm 不显示数据有很多

unit-testing - 使 Go 测试彼此独立(全局变量的突变)

go - 指针新手 - 纠正我

go - 等待非子进程结束

go - 运行时/cgo : pthread_create failed: Resource temporarily unavailable