Heim >Backend-Entwicklung >Golang >Ist die Go-Sprache mit der C-Sprache kompatibel?

Ist die Go-Sprache mit der C-Sprache kompatibel?

青灯夜游
青灯夜游Original
2022-12-26 10:23:045614Durchsuche

go-Sprache ist mit der C-Sprache kompatibel; die Go-Sprache kann die C-Sprache aufrufen und kann auch die C-Sprache aufrufen. Es gibt einen Cgo-Befehl im Go-Sprach-Toolkit, mit dem Vorgänge im Zusammenhang mit Go-Aufrufen von C verarbeitet werden. Go-Funktionen können nach C exportiert werden. Fügen Sie einfach „//export funcname“ vor der zu exportierenden Funktion hinzu Dann können Sie den Befehl „go build -buildmode=c-shared -o libxxx.so“ verwenden, um dynamische Bibliotheken und Header-Dateien für die Verwendung in der C-Sprache zu kompilieren und zu generieren.

Ist die Go-Sprache mit der C-Sprache kompatibel?

Die Betriebsumgebung dieses Tutorials: Windows 7-System, GO Version 1.18, Dell G3-Computer.

C-Sprache und Golang sind kompatibel. Die .c-Datei, die Sie in C schreiben, kann von Golang referenziert und direkt verwendet werden.

Viele der verschiedenen modernen Programmiersprachen auf hoher Ebene basieren auf der C-Sprache und können im Grunde die C-Sprache aufrufen, und in einigen Fällen hat dies auch diese Anforderung und Bedeutung der Existenz. Die Go-Sprache unterstützt diesen Aspekt sehr gut. Sie kann nicht nur die C-Sprache aufrufen, sondern auch die C-Sprache. In diesem Artikel werden die relevanten Inhalte erläutert.

Grundlegende Beschreibung

Es gibt einen Cgo-Befehl im Go-Sprach-Toolkit, der für die Verarbeitung von Vorgängen im Zusammenhang mit Go-Aufrufen von C verwendet wird. Wir können diesen Befehl direkt verwenden oder ihn automatisch aufrufen, wenn wir ein Go-Programm ausführen oder erstellen.

Cgos Verarbeitung der C-Sprache selbst hängt von der C-Sprach-bezogenen Kompilierungstoolkette im System ab, daher müssen Sie auf die Einstellungen achten, hauptsächlich auf die Umgebungsvariableneinstellungen von Go:

Ist die Go-Sprache mit der C-Sprache kompatibel?

Besondere Aufmerksamkeit muss geschenkt werden Die Anforderungen von Cgo Enabled können mit dem Befehl go env -w CGO_ENABLED=1 festgelegt werden. Im Bild oben sehen Sie einige FLAGS-Parameter beim Kompilieren von C. Sie können die Einstellungen bei Bedarf entsprechend anpassen. Darüber hinaus ist der obige CC CXX die Einstellung der Kompilierungs-Toolkette, die auch je nach Bedarf angepasst werden kann. go env -w CGO_ENABLED=1 命令来设置。上图中可以看到一些C编译时的FLAGS参数,如果有需要也可以进行相应设置调整。另外上面的 CC CXX 是编译工具链的设置,也可以根据需求设置调整。

Go中调用C

Go中调用C语言最终在Go中都显示为名为 C 的伪包, 在Go中 import "C" 行之上以注释 #include ... 方式来引用C语言相关的库。 这些被引用的库中公共的变量和函数等在Go中会被挂到 C 包中以供使用。下面是个简单的演示:

Ist die Go-Sprache mit der C-Sprache kompatibel?

在Go中调用C只要上面这样就行了,使用起来还是很方便的。

通常来说C语言程序的项目中除了C语言代码外可能还有汇编代码;或者项目也有可能是C/C++混合编程的。这些项目都可以在Go中使用,Cgo会自动识别后缀为 .c .s .S .sx .cc .cpp .cxx 的文件,并调用对应的编译器去编译。

需要注意的是C++中的重载和类方法等C不支持的语法想要在Go中使用都需要用C语言标准函数包装一层,使用方法就和C语言中调用C++一样。【相关推荐:Go视频教程编程教学

C中调用Go

下面测试中如果有问题可以尝试 go clean 重置项目后再进行。

Go的函数可以导出给C用,只要在要导出的函数前面加上 //export funcname 就行了,然后可以使用 go build -buildmode=c-shared -o libxxx.so 命令编译生成动态库和头文件供C语言中使用:

Ist die Go-Sprache mit der C-Sprache kompatibel?
Ist die Go-Sprache mit der C-Sprache kompatibel?

另外也可以使用 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)

除了上面的基础类型,指针也是可以传递的。特别的C语言中的 void* 指针相当于Go中的 unsafe.Pointer

C中的 __int128_t__uint128_t 相当于Go中的 [16]byte

🎜🎜C in Go aufrufen🎜🎜🎜C-Sprache in Go aufrufen wird schließlich als Pseudopaket mit dem Namen C in Go angezeigt, 🎜in Go#include ... über der Zeile code>import "C", um auf C-Sprachbibliotheken zu verweisen. 🎜 Öffentliche Variablen und Funktionen in diesen referenzierten Bibliotheken werden zur Verwendung in Go mit dem C-Paket verknüpft. Hier ist eine einfache Demonstration: 🎜🎜Bildbeschreibung hier einfügen 🎜 🎜Um C in Go aufzurufen, gehen Sie einfach wie oben beschrieben vor, die Verwendung ist sehr praktisch. 🎜🎜Im Allgemeinen können C-Sprachprogrammprojekte zusätzlich zum C-Sprachcode Assembler-Code enthalten, oder das Projekt kann auch eine gemischte C/C++-Programmierung sein. Diese Projekte können in Go verwendet werden und Cgo erkennt das Suffix automatisch als .c .s .S .sx code > <code>.cc .cpp .cxx Datei und rufen Sie den entsprechenden Compiler zum Kompilieren auf. 🎜🎜Es ist zu beachten, dass von C nicht unterstützte Syntax wie Überladung und Klassenmethoden in C++ mit einer Ebene von C-Sprachstandardfunktionen umschlossen werden muss, wenn Sie sie in Go verwenden möchten. Die Verwendungsmethode ist dieselbe wie beim Aufrufen von C++ in C-Sprache. [Verwandte Empfehlungen: Go-Video-Tutorial🎜, Programmierunterricht🎜]🎜🎜🎜🎜Rufen Sie Go in C an🎜🎜🎜Wenn es welche gibt Folgender Test: Wenn ein Problem auftritt, können Sie mit go clean das Projekt zurücksetzen und es erneut versuchen. 🎜🎜Go-Funktionen können nach C exportiert werden. Fügen Sie einfach //export funcname vor der zu exportierenden Funktion hinzu und verwenden Sie dann go build -buildmode=c -shared Der Befehl -o libxxx.so kompiliert und generiert dynamische Bibliotheken und Header-Dateien zur Verwendung in der C-Sprache: 🎜🎜Bildbeschreibung hier einfügen
Bildbeschreibung hier einfügen🎜🎜Darüber hinaus können Sie auch go build -buildmode=c-archive -o libxxx.a verwenden, um eine statische Bibliothek zu kompilieren und zu generieren, die dies kann in C-Sprache verwendet werden. 🎜🎜
🎜🎜Unterschiede in den Datentypen🎜🎜🎜Der Aufruf zwischen den beiden Sprachen ist eigentlich die Übertragung von Daten. Da es sich bei den beiden schließlich nicht um dieselbe Sprache handelt, ist zu beachten. Sie können miteinander interagieren. Die Datentypen sind eingeschränkt. Manchmal muss eine Datentypkonvertierung erzwungen werden, wie zum Beispiel im folgenden Code: 🎜
C.f(&C.arr[0])
🎜Die grundlegenden numerischen Typkonvertierungen, die zwischen den beiden verfügbar sind, sind wie folgt: 🎜
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))
}
🎜Zusätzlich zu den oben genannten Grundtypen können auch Zeiger übergeben werden. Insbesondere entspricht der void*-Zeiger in der C-Sprache dem unsafe.Pointer in Go. 🎜🎜__int128_t und __uint128_t in C entsprechen [16]byte in Go. 🎜

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是变量数据类型。

更多编程相关知识,请访问:编程视频!!

Das obige ist der detaillierte Inhalt vonIst die Go-Sprache mit der C-Sprache kompatibel?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn