2016-04-07 7 views
0
import "C" 

func f() { 
    var vGo int 
    var vC C.int 
    // fails to compile with error 
    // cannot use &vGo (type *int) as type *C.int in argument to... 
    C.c_function(&vGo) 
    // compiles just fine: 
    C.c_function(&vC) 
} 

私はCGO_ENABLED = 1 GOARCH =アームを使用してコンパイル...intとC.intの違いは何ですか?

この場合はint型で異なるとC.int種類は何ですか?
GOのCタイプに関する追加情報はどこにありますか?

答えて

2

種類の違いは何ですか?場合によります。 64ビットであれば、Go intは64ビットになり、C intは32になります。32ビットであれば、実際の違いはありません。

GoのどこにCタイプに関する追加情報がありますか?コメントに記載されているように、暗黙の数値型変換はGoでは許可されていないので、変換が必要です。

+1

申し訳ありませんが、2番目の部分が正しくありません。 Goのintはアーキテクチャに応じて64ビットまたは32ビットのいずれかになります。 https://golang.org/ref/spec#Numeric_types – jupp0r

+0

@ jupp0rはい、私の言語はおそらく十分ではありませんでしたが、私はあなたが64ビットであればそれを伝えようとしていました。 – evanmcdonnal

+0

関連する違いは、32ビットまたは64ビットではなく、異なるタイプであり、Goは暗黙の数値型変換を許可しないということです。タイプが同じサイズかどうかにかかわらず、同じエラーが発生します。 – JimB

1

Goが意図いくつかの例外1と、暗黙の型変換をサポートしていない:

値xが型Tの変数に割り当て可能であり、これらの場合のいずれにおいても(「xがTに割り当て可能です」)。

  • XのタイプはT.
  • Xの型VとTと同一である同一の基礎となる型を有し、VまたはTの少なくとも一方は、名前付き型ではありません。
  • Tはインタフェース型であり、xはTを実装します。
  • xは双方向チャネル値、Tはチャネル型、xの型VとTは同じ要素型を持ち、VまたはTの少なくとも1つはa名前付きの型。
  • xは事前宣言された識別子nilであり、Tはポインタ、関数、スライス、マップ、チャネル、またはインタフェースの型です。
  • xはあなたの場合の変換は潜在的に異なるメモリレイアウト2と一致するために必要とされる

型Tの値によって型なし定数表現です。

関連する問題