0

次の簡単なテスト go コードがあります: 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 ブロックと最初の import ステートメントの間にスペースを追加できないのはなぜですか?

この種のエラーが再び表示された場合、どのようにデバッグするのが最善ですか?

4

2 に答える 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 )
{
     int i; 
     for(i=0;i<n;i++) {
        p[i]=i;
    } 
    return n;
}
*/
import "fmt"
import "C"

コメント内のコードは単なる別のコメントであり、直後にインポート "C" が続くわけではないため、cgo によって処理されません。(というかimport "C"、コメントが前にありません)

于 2014-10-16T18:18:55.347 に答える