为了账号安全,请及时绑定邮箱和手机立即绑定

Cgo:找不到使用带有 const char* 参数的回调的方法

Cgo:找不到使用带有 const char* 参数的回调的方法

Go
ibeautiful 2021-11-08 19:37:46
我正在使用 Go 中的 C 库,使用 Cgo 以及除了回调之外的所有好东西。库有回调设置器,它需要指向回调函数的指针。回调函数本身用 go 编写并使用 Cgo 语法导出。问题:我可以使用char *参数创建和导出函数,但不能使用const char *.代码说明:test.go:package main/*typedef void (*cb_func)(const char *, int);void callback(cb_func);void myFunc(const char *, int);*/import "C"import (        "fmt"        "unsafe")//export myFuncfunc myFunc(buf *C.char, ln C.int) {        fmt.Printf("Got: %s\n", C.GoStringN(buf, ln))}func main() {        C.callback((C.cb_func)(unsafe.Pointer(C.myFunc)))}测试.c:typedef void (*cb_func)(const char *, int);void callback(cb_func cb) {        cb("test", 4);}输出go build:In file included from $WORK/test/_obj/_cgo_export.c:2:0:./test.go:54:13: error: conflicting types for 'myFunc'./test.go:7:6: note: previous declaration of 'myFunc' was here void myFunc(const char *, int);      ^/tmp/go-build994908053/test/_obj/_cgo_export.c:9:6: error: conflicting types for 'myFunc' void myFunc(char* p0, int p1)      ^In file included from $WORK/test/_obj/_cgo_export.c:2:0:./test.go:7:6: note: previous declaration of 'myFunc' was here void myFunc(const char *, int);      ^没有const限定符的代码编译并按预期工作。*C.char在 C 中可以使用什么来获取 const 字符串?
查看完整描述

2 回答

?
蝴蝶刀刀

TA贡献1801条经验 获得超8个赞

我遇到过同样的问题。仍然需要的人的一种解决方案是:


typedef const char cchar_t

void myNewFunction(cchar_t* data);

然后在 go 中使用它 data* C.char_t


查看完整回答
反对 回复 2021-11-08
?
子衿沉夜

TA贡献1828条经验 获得超3个赞

由于 Go 没有const指针修饰符,因此无法从 Go 代码内部转换此行为。cgo 将始终生成没有const修饰符的标题。这也是您的代码无法正确构建的原因:仅根据它知道的内容cgo创建myFuncbufshould be char*,not const char*

处理此问题的最佳方法是在 C 端使用包装器将该参数转换为const char*. 在你的情况下,改变 to 的定义就足够myFuncvoid myFunc(char*, int)cb_func无论如何,将函数传递给将起作用,因为强制转换myFunc(*cb_func)(const char*,int)仅添加类型信息但不会更改内存布局。


查看完整回答
反对 回复 2021-11-08
  • 2 回答
  • 0 关注
  • 235 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信