我有以下简单的测试代码:call_c.gopackage main/*int getData(int *p, int n ){ int i; for(i=0;i<n;i++) { p[i]=i; } return n;}*/import "C"import "fmt"func main() { var a [5]int32 i := C.getData((*C.int)(&a[0]), 5) fmt.Println(i, a)}我使用“ go build call_c.go ”来构建程序并且构建良好。但是我发现如果我简单地将“import fmt”、“import C”的顺序颠倒或者在C /* */块代码和第一个import语句之间添加一个换行符,“go build call_c.go”命令就会返回一个错误:go build call_c.go37: error: 'getData' undeclared (first use in this function)专家地鼠的问题:为什么导入顺序在 go 中很重要?为什么我不能在 C 块和第一个导入语句之间添加空格?如果我再次看到这种错误,如何最好地调试它?
2 回答
元芳怎么了
TA贡献1798条经验 获得超7个赞
导入的顺序通常并不重要。但是import "C"在使用 cgo 时很特别。
从文档:
如果“C”的导入紧跟在注释之前,则该注释称为序言,在编译包的 C 部分时用作标头。例如:
// #include <stdio.h>
// #include <errno.h>
import "C"
因此,如果在包含 C 代码import "C"的注释和 之间有一个换行符,那么该注释只是另一个注释,不会被 cgo 处理。
同样,如果您颠倒导入顺序:
/*
int getData(int *p, int n )
{
int i;
for(i=0;i<n;i++) {
p[i]=i;
}
return n;
}
*/
import "fmt"
import "C"
注释中的代码只是另一个注释,不会被 cgo 处理,因为它后面没有紧跟导入“C”。
- 2 回答
- 0 关注
- 301 浏览
添加回答
举报
0/150
提交
取消