Go 言語は C 言語と互換性があり、Go 言語は C 言語を呼び出すことができ、また C 言語を呼び出すこともできます。 Go 言語ツールキットには Cgo コマンドがあり、これは C を呼び出す Go に関連する操作を処理するために使用されます。Go 関数は C にエクスポートでき、エクスポートする関数の前に「//export funcname」を追加するだけです。その後、「go build -buildmode=c-shared -o libxxx.so」コマンドを使用して、C 言語で使用するダイナミック ライブラリとヘッダー ファイルをコンパイルおよび生成できます。
このチュートリアルの動作環境: Windows 7 システム、GO バージョン 1.18、Dell G3 コンピューター。
C言語とgolangは互換性があります。 C で作成した .c ファイルは、golang で参照して直接使用できます。
現代の高級プログラミング言語の多くはC言語をベースに構築されており、基本的にはC言語を呼び出すことができますが、これも必要で存在する場合があります。 。 Go 言語はこの点を非常によくサポートしており、C 言語だけでなく C 言語も呼び出すことができます。この記事では関連する内容を解説していきます。
Go 言語ツールキットには Cgo コマンドがあり、Go による C の呼び出しに関連する操作を処理するために使用されます。このコマンドは直接使用することも、Go プログラムの実行時または構築時に自動的に呼び出すこともできます。
Cgo による C 言語の処理自体は、システム内の C 言語関連のコンパイル ツール チェーンに依存しているため、設定、主に Go 環境変数の設定に注意する必要があります。
Cgo を有効にする必要があることに特に注意してください。これは、go env -w CGO_ENABLED=1
コマンドを使用して設定できます。上の図では、C コンパイル中にいくつかの FLAGS パラメータが表示されます。必要に応じて、設定を調整できます。また、上記の CC
CXX
はコンパイル ツール チェーンの設定であり、必要に応じて調整することもできます。
Go での C 言語の呼び出しは、最終的に Go では C
という名前の疑似パッケージとして表示されます。 , Go では、#import "C"
行の上にあるコメント #include ...
を使用して、C 言語関連のライブラリを参照します。 これらの参照ライブラリ内のパブリック変数と関数は、Go で使用するために C
パッケージにハングされます。以下は簡単なデモです:
Go で C を呼び出すには、上記の操作を行うだけで、非常に便利です。
一般に、C 言語プログラム プロジェクトには、C 言語コードに加えてアセンブリ コードが含まれる場合や、C/C 混合プログラミングの場合もあります。これらのプロジェクトは Go で使用でき、Cgo はサフィックスを .c
.s
.S
.sx
として自動的に認識します。 .cc
.cpp
.cxx
ファイルを作成し、対応するコンパイラを呼び出してコンパイルします。
C のオーバーロードやクラスメソッドなど、C でサポートされていない構文を Go で使用するには、C 言語の標準関数のレイヤーでラップする必要があることに注意してください。 C 言語で C を呼び出すのと同じです。 [関連する推奨事項: Go ビデオ チュートリアル 、プログラミング教育 ]
次のテストで問題が発生した場合は、続行する前に go clean を試し、プロジェクトをリセットしてください。
//export funcname を追加し、
go build -buildmode =c を使用するだけです。 -shared -o libxxx.so このコマンドは、C 言語で使用する動的ライブラリとヘッダー ファイルをコンパイルして生成します。
go build -buildmode=c-archive -o libxxx.a を使用して、C 言語で使用できる静的ライブラリをコンパイルして生成します。
package rand // #include <stdlib.h> import "C" func Random() int { return int(C.random()) // C函数返回值给Go,random的返回值是long类型 } func Seed(i int) { C.srandom(C.uint(i)) // Go传值给C的函数,srandom函数接收uint类型数据 }
C.char, C.schar (signed char), C.uchar (unsigned char) C.short, C.ushort (unsigned short) C.int, C.uint (unsigned int) C.long, C.ulong (unsigned long) C.longlong (long long), C.ulonglong (unsigned long long) C.float, C.double C.complexfloat (complex float), C.complexdouble (complex double)
void* ポインタは、Go の
unsafe.Pointer に相当します。 C の
__int128_t および
__uint128_t は、Go の
[16]byte に相当します。
C中函数传输参数为数组的话直接传递数组名就行,在Go中向这类函数传递数组需要传递数组第一个元素的地址,另外需要注意的是数组中元素也必须是C语言中支持的类型:
C.f(&C.arr[0])
C中并没有string类型,使用字符串时需要进行处理:
package print // #include <stdio.h> // #include <stdlib.h> import "C" import "unsafe" func Print(s string) { cs := C.CString(s) // 这个方式会将字符串拷贝一份,返回指针,注意使用完需要释放内存 defer C.free(unsafe.Pointer(cs)) // defer修饰的语句会在该函数退出前执行 C.fputs(cs, (*C.FILE)(C.stdout)) }
另外C语言的字符串 *C.char
可以使用 C.GoString()
转换成Go中的字符串。
C中的 struct
union
enum
这些类型在Go使用需要加上对应的前缀,变成 struct_xxx
union_xxx
enum_xxx
。其中联合体在Go中将成为字节数组的形式。这些对象的成员名如果和Go的关键词一样的话,在Go中使用需要在成员名前面加下划线,比如 x._name
。
C中的 sizeof
在Go中需要使用 C.sizeof_T
方式使用,T是变量数据类型。
更多编程相关知识,请访问:编程视频!!
以上がGo言語はC言語と互換性がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。