慕尼黑8549860
2021-08-23 16:35:25
我有以下簡(jiǎn)單的測(cè)試代碼: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 ”來(lái)構(gòu)建程序并且構(gòu)建良好。但是我發(fā)現(xiàn)如果我簡(jiǎn)單地將“import fmt”、“import C”的順序顛倒或者在C /* */塊代碼和第一個(gè)import語(yǔ)句之間添加一個(gè)換行符,“go build call_c.go”命令就會(huì)返回一個(gè)錯(cuò)誤:go build call_c.go37: error: 'getData' undeclared (first use in this function)專(zhuān)家地鼠的問(wèn)題:為什么導(dǎo)入順序在 go 中很重要?為什么我不能在 C 塊和第一個(gè)導(dǎo)入語(yǔ)句之間添加空格?如果我再次看到這種錯(cuò)誤,如何最好地調(diào)試它?
2 回答

元芳怎么了
TA貢獻(xiàn)1798條經(jīng)驗(yàn) 獲得超7個(gè)贊
導(dǎo)入的順序通常并不重要。但是import "C"在使用 cgo 時(shí)很特別。
從文檔:
如果“C”的導(dǎo)入緊跟在注釋之前,則該注釋稱(chēng)為序言,在編譯包的 C 部分時(shí)用作標(biāo)頭。例如:
// #include <stdio.h>
// #include <errno.h>
import "C"
因此,如果在包含 C 代碼import "C"的注釋和 之間有一個(gè)換行符,那么該注釋只是另一個(gè)注釋?zhuān)粫?huì)被 cgo 處理。
同樣,如果您顛倒導(dǎo)入順序:
/*
int getData(int *p, int n )
{
int i;
for(i=0;i<n;i++) {
p[i]=i;
}
return n;
}
*/
import "fmt"
import "C"
注釋中的代碼只是另一個(gè)注釋?zhuān)粫?huì)被 cgo 處理,因?yàn)樗竺鏇](méi)有緊跟導(dǎo)入“C”。
- 2 回答
- 0 關(guān)注
- 323 瀏覽
添加回答
舉報(bào)
0/150
提交
取消