猿问

调用c函数,“import fmt”,“import C”的顺序导致构建错误,为什么?

我有以下简单的测试代码:call_c.go

package 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.go

37: error: 'getData' undeclared (first use in this function)

专家地鼠的问题:

为什么导入顺序在 go 中很重要?


为什么我不能在 C 块和第一个导入语句之间添加空格?


如果我再次看到这种错误,如何最好地调试它?


慕尼黑8549860
浏览 302回答 2
2回答

元芳怎么了

导入的顺序通常并不重要。但是import "C"在使用 cgo 时很特别。从文档:如果“C”的导入紧跟在注释之前,则该注释称为序言,在编译包的 C 部分时用作标头。例如:// #include <stdio.h>// #include <errno.h>import "C"因此,如果在包含 C 代码import "C"的注释和 之间有一个换行符,那么该注释只是另一个注释,不会被 cgo 处理。同样,如果您颠倒导入顺序:/*int getData(int *p, int n ){&nbsp; &nbsp; &nbsp;int i;&nbsp;&nbsp; &nbsp; &nbsp;for(i=0;i<n;i++) {&nbsp; &nbsp; &nbsp; &nbsp; p[i]=i;&nbsp; &nbsp; }&nbsp;&nbsp; &nbsp; return n;}*/import "fmt"import "C"注释中的代码只是另一个注释,不会被 cgo 处理,因为它后面没有紧跟导入“C”。
随时随地看视频慕课网APP

相关分类

Go
我要回答