使用以C类型作为参数的导出函数类型时遇到问题

编辑:由于@Not_a_Golfer </ p>

我一直在尝试Go,无法解决此问题。</ p>

当它包含在主程序包中时,下面的方法可以正常工作:</ p>

 <代码> //定义一个回调函数类型,并为其定义一个调用程序
type回调函数(i C.int,d C.double)
func调用(cb回调,i C.int,d C.double){
cb(i,d)
}
// ...然后定义我的回调并将其传递给调用者
func foo(i C.int,d C. double){
fmt.Printf(“ i%dd%f
”,i,d)
}
func main(){
Invoke(foo,2,2.2)
}
</ code > </ pre>

但是当我在包中定义 type回调</ code>和 Invoke </ code>时,将包导入main并调用 mypkg。 Invoker(foo,2,2.2)</ code>我收到以下构建错误:</ p>

  src / hello / hello.go:9:无法转换foo(类型func(  C.int,  C.double))键入mypkg.Callback 
</ code> </ pre>

编辑:这是hello包的主要代码。 我对所有内容进行了结构化,以便可以使用 go </ code>命令进行构建/安装:</ p>

  package main \  nimport“ C” 
import“ mypkg”
import“ fmt”
func foo(i C.int,d C.double){
fmt.Printf(“ i%dd%f
”,i,d)\ n}
func main(){
mypkg.Invoke(mypkg.Callback(foo),2,2.2)
}
</ code> </ pre>

任何人都知道是否有任何东西 从包中导出的类型需要特殊处理吗? 我在参数中使用了C类型,因为最终这将是C库的包装,并且我只是想确保C类型不属于将我的回调函数与回调类型匹配的问题的一部分。 </ p>

以下是程序包代码:</ p>

 程序包mypkg 
import“ C”
import“ fmt“
type回调函数(i C.int,d C.double)
func调用(cb回调,i C.int,d C.double){
fmt.Println(” Calling cb
“)
cb(i,d)
}
</ code> </ pre>
</ div>

展开原文

原文

EDIT: changed the title to better reflect the problem thanks to @Not_a_Golfer

I have been experimenting with Go and cannot figure out this problem.

The following works fine when it is contained within the main package:

// Define a callback-function type, and define an invoker for it
type Callback func(i C.int, d C.double)
func Invoke(cb Callback, i C.int, d C.double) {
        cb(i, d)
}
//... then define my callback and pass it into the invoker
func foo(i C.int, d C.double) {
        fmt.Printf("i %d d %f
", i, d)
}
func main() {
        Invoke(foo, 2, 2.2)
}

But when I define type Callback and Invoke in a package, import the package into main and call mypkg.Invoker(foo, 2, 2.2) I get the following build error:

src/hello/hello.go:9: cannot convert foo (type func(C.int, C.double)) to type mypkg.Callback

Edit: here's the main code for the hello package. I structured everything so that I can use the go command for build/install:

package main
import "C"
import "mypkg"
import "fmt"
func foo(i C.int, d C.double) {
        fmt.Printf("i %d d %f
", i, d)
}
func main() {
        mypkg.Invoke( mypkg.Callback(foo), 2, 2.2 )
}

Anybody know if there's anything special to be done for a type exported from a package? I'm using C types in the arguments because eventually this will be a wrapper around a C-library, and I just wanted to be sure the C types were not part of the problem matching my callback function to the callback type.

Here's the package code:

package mypkg
import "C"
import "fmt"
type Callback func(i C.int, d C.double)
func Invoke(cb Callback, i C.int, d C.double) {
        fmt.Println("Calling cb
")
        cb( i, d )
}

cgo
dqsong2010
dqsong2010 就像内置函数并不是真正的函数。对于“编译为本地语言”,我们接受。思维C语言,胡说八道。
大约 5 年之前 回复
dongqiang2358
dongqiang2358 你应该。我在C文档中没有发现任何提示原因的内容,但我怀疑它涉及幕后代码生成,每个包的C名称空间可能都不相同。
大约 5 年之前 回复
douhanshu5517
douhanshu5517 是的,现在可以了。因此,如果您确实需要跨包边界的那些类型,则可以在包内声明类型别名,例如键入MyIntC.int等。也许我应该更改标题以更好地反映在包接口中使用C类型的实际问题?
大约 5 年之前 回复
dousuo2812
dousuo2812 我自己删除了它,因为它回答了您的第一个问题(您没有投放功能)但没有解决您的问题。
大约 5 年之前 回复
dseomy1964
dseomy1964 是的,这很有意义。我不知道为什么删除您的答案,但感谢您的帮助。
大约 5 年之前 回复
dongpenggan6812
dongpenggan6812 一个更新:它似乎在函数中使用了C类型,因为它与goint和float32一起使用。当我停止使用Callback类型而只是将Invoke更改为func类型的参数(C.int,C.double)时,出现此错误:src/hello/hello.go:9:无法使用foo(typefunc(C.int,C.double))作为mypkg.Invoke的参数中的func(mypkg.C.int,mypkg.C.double)类型
大约 5 年之前 回复
dscss8996
dscss8996 正如我在删除的答案中所写的那样,这是C包独有的问题,而不是一个普遍的问题,如果您将Callback的签名更改为使用本机go类型,那么一切都会起作用。我不知道确切的原因,但也许您应该更改标题或其他内容。
大约 5 年之前 回复

1个回答



它们实际上是不同的类型!</ p>

将代码更改为:</ p>

 包main 

import“ C”
import“ mypkg”

func main(){
a:= 1

mypkg.Inc(C.int(a))

}
</ code> </ pre>

mypkg:</ p>

  package mypkg 

import“ C”

func Inc (a C.int)C.int {
返回+ 1
}
</ code> </ pre>

编译第一个程序包将得到错误:
./test.go :9:无法在mypkg.Inc的参数中使用C.int(a)(C.int类型)作为mypkg.C.int类型</ p>
</ div>

展开原文

原文

They are actually different types!

Change your code to:

package main

import "C"
import "mypkg"

func main() {
    a := 1

    mypkg.Inc(C.int(a))
}

mypkg:

package mypkg

import "C"

func Inc(a C.int) C.int {
    return a + 1
}

Compile first package will get error: ./test.go:9: cannot use C.int(a) (type C.int) as type mypkg.C.int in argument to mypkg.Inc

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐