go - 在两个文件中导入 "C"类型时,无法将 C.struct_Foo 类型的变量用作 package.C.struct_Foo 类型

标签 go

即使我将相同 C 头文件包含到 2 个不同的 go 文件中,我也会收到错误,因为编译器认为类型不同。我最初在系统范围内包含 header (使用没有路径位置的 <>),但这也不起作用。

// main.go

package main

import (
    "fmt"
    "github.com/john-difool/test/lib"
)

//#include "lib/types.h"
import "C"

func main() {
    var p C.Point

    p.x = 0
    p.y = 0
    fmt.Println(lib.CheckPoint(p))
}


// lib/lib.go

package lib

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

func CheckPoint(pt C.Point) bool {
    return true // TOnotDO
}


// lib/types.h

typedef struct Point {
    float x;
    float y;
} Point;

这是我正在做的错误 go build在顶层:

cannot use p (type C.struct_Point) as type lib.C.struct_Point in argument to lib.CheckPoint

最佳答案

编辑:使用小写 C header :
您需要定义新的 Setter 方法和 像这样从 lib 中导出点,它将起作用:
工作样本:
lib.go 文件:

package lib

/*
typedef struct{
    float x;
    float y;
}  point_t;
*/
import "C"

type Point C.point_t

func (p *Point) SetX(x float32) {
    p.x = C.float(x)
}

func (p *Point) SetY(y float32) {
    p.y = C.float(y)
}

func CheckPoint(pt Point) bool {
    return pt.x == 1 && pt.y == 2
}

main.go 文件:

package main

import (
    "fmt"

    "github.com/john-difool/test/lib"
)

func main() {
    var p lib.Point

    p.SetX(1)
    p.SetY(2)
    fmt.Println(lib.CheckPoint(p)) //true
}

旧的: 像这样从 lib 中导出点,它将起作用:
工作样本:
lib.go 文件:

package lib

/*
typedef struct{
    float X;
    float Y;
}  Point_t;
*/
import "C"

type Point C.Point_t

func CheckPoint(pt Point) bool {
    return pt.X == 1 && pt.Y == 2
}

main.go 文件:

package main

import (
    "fmt"

    "github.com/john-difool/test/lib"
)

func main() {
    var p lib.Point

    p.X = 1
    p.Y = 2
    fmt.Println(lib.CheckPoint(p)) //true
}

关于go - 在两个文件中导入 "C"类型时,无法将 C.struct_Foo 类型的变量用作 package.C.struct_Foo 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37503002/

相关文章:

colors - 理解 Go 标准库中的一些魔法

docker - 如何为ARM设备构建Docker镜像?

pointers - 指向结构的 Nil 指针不深等于 nil?

go - GoLang中的内置类型(或未定义类型)是什么?

go - 获取 RPC 描述符失败

go - 用文件中的模式替换字符串

golang File WriteString 封面

json - 获取 json 动态键名作为字符串?

dictionary - 获取 map 键之间的所有范围

xml - 如何在 golang 中编码 CDATA 与使用换行符输入数据相同