在两个文件中导入“C”类型时,不能使用类型为C.struct_Foo的变量作为类型package.C.struct_Foo

时间:2016-05-28 19:23:27

标签: go

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

// 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处理的错误:

  

不能使用p(类型C.struct_Point)作为类型lib.C.struct_Point   lib.CheckPoint的参数

1 个答案:

答案 0 :(得分:1)

编辑:小写C标题
你需要定义新的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
}