即使我将相同 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/