int
C 関数を呼び出している Go プログラムでは、 からに正常に変換できptrdiff_t
ます。int8
( Go 型が最新のアーキテクチャに対して小さすぎる場合でも、多少懸念されることもありますが、正常にコンパイルされます。)ただし*int
、*ptrdiff_t
コンパイラ エラーが発生します: cannot convert <varname> (type *int) to type *_Ctype_ptrdiff_t
. 正常なコンパイルを許可する唯一の型はint64
. 変数を (*)C.ptrdiff_t として宣言できることはわかっていますが、対応する適切な Go 型と、この場合の Go コンパイラの予期しない動作を理解したいですか?
1 に答える
2
ptrdiff_t は、特定のサイズの整数型です。別の整数型を ptrdiff_t に変換すると、コンパイラは整数のサイズを変更します。つまり、古い整数のメモリ表現を新しい型と一致するように変更します。この新しい表現は、メモリ内の別の場所に配置されます。
ポインタはメモリ内の場所です。したがって、同じメモリ レイアウトを指す型にのみ変換できます。int64 は ptrdiff_t と同じサイズであるため、メモリ表現は同じであり、ポインタは自由に変換できます。
任意の整数型を変換する場合は、最初にそのメモリ内表現を変更し、それを変数に割り当ててそのポインタを取得することにより、新しい場所を指定する必要があります。
newtype := ptrdiff_t(oldInt)
pnewtype := &newtype
于 2014-01-19T01:46:07.933 に答える