首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >传递给Go的C引用不能识别typedef void*?

传递给Go的C引用不能识别typedef void*?
EN

Stack Overflow用户
提问于 2019-12-15 16:21:26
回答 1查看 148关注 0票数 1

c.h

代码语言:javascript
复制
typedef void*       MVar;

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

test.go

代码语言:javascript
复制
var cvar unsafe.Pointer

_ = C.C_FUNC(&cvar)

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

代码语言:javascript
复制
cannot use _cgo5 (type *unsafe.Pointer) as type *_Ctype_MVar 
in argument to _Cfunc_C_FUNC

在这个文档命令cgo: Go引用C中,它说“C类型的void*由Go的unsafe.Pointer表示。”

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-15 20:13:33

不能将_cgo5 (*unsafe.Pointer类型)用作_Cfunc_C_FUNC参数中的*_Ctype_MVar类型

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

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

代码语言:javascript
复制
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))
}

输出:

代码语言:javascript
复制
$ go run so.go
0xc000010028 0x592d18 42
0xc000010028 0x592d18 42
$
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59345750

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档