【问题标题】:cgo how to represent go types in c?cgo如何在c中表示go类型?
【发布时间】:2015-10-20 12:30:05
【问题描述】:

export go func 到 c 时,接口类型 port 到 GoInterface,int 到 GoInt。如何移植我的 c 函数以使用这些类型?

啊。

void *SomeFunc(GoInterface arg);

交流

void *SomeFunc(GoInterface arg) {
}

去吧

package main

// #include "a.h"
import "C"

type A struct {
}

func main() {
    var a = new(A)
}

当我开始构建时:

cc errors for preamble:
In file included from ./a.go:3:0:
a.h:1:16: error: unknown type name 'GoInterface'
 void *SomeFunc(GoInterface arg)

有没有像 java 的 jni.h 这样的 go 头文件,所以我可以包含类型。

【问题讨论】:

    标签: go cgo


    【解决方案1】:

    不,Go 没有任何方法可以将类型导出为“C 可读”。此外,您不能从 C 中引用 Go 结构,并且尝试将 C 结构设置为“看起来像”Go 结构是不安全的,因为您无法控制内存布局。 p>

    执行此操作的“正确”方法是在 C 文件中创建一个类型并将其作为字段添加到 Go 结构中:

    // from C
    typedef struct x {
        // fields
    } x;
    
    
    // From Go, include your .h file that defines this type.
    type X struct {
       c C.x
    }
    

    然后以这种方式对您的类型进行操作,并将 C.x 传递给您的所有 C 函数而不是 x

    还有其他几种方法(例如,在您想将其用作其中一种时,随时在它们之间进行转换),但从模糊的一般意义上来说,这种方法是最好的。

    编辑:少数 Go 类型可以用 C 表示,例如,int64 将在通过 cgo 编译的代码中定义,但我所说的大部分情况下都成立。

    【讨论】:

    • 也许最好说这些类型是已定义的,但它们只是直通的。您唯一可以有意义/安全地对它们做的事情就是将它们传递回 Go 代码。
    • 是的,这就是重点!因为我唯一能做的就是把它们传回去。从我可以得到它们的地方。因为,go 不能将这些类型传递给我。我没有办法在 C 中构建一个。这让我很困惑。感谢您的耐心,Jsor。
    • 这就是我在回答中所说的,你想使用 C 中的 C 结构,然后对于你从 C 调用的所有代码,你想返回一个 C.x 而不是 X。你可以甚至创建一个像func AsCType(x *X) *C.x 这样的函数并调用AsCType(MyFunctionThatReturnsX())
    • 是的,我按照你在我的代码中所说的做了。我#defined void * GoObject,并在我的代码中将它用于 go struct 类型,它工作正常。也许 _cgo_export.h 直到现在还不是一个完整的设计。谢谢你的回答。
    • 这些类型在 cgo 内部使用。它们没有记录在案,也不打算供使用 cgo 的程序使用。
    猜你喜欢
    • 2012-11-12
    • 1970-01-01
    • 1970-01-01
    • 2021-08-13
    • 2021-02-20
    • 1970-01-01
    • 1970-01-01
    • 2021-12-22
    相关资源
    最近更新 更多