go语言兼容c语言吗

青灯夜游
Lepaskan: 2022-12-26 17:51:33
asal
5443 orang telah melayarinya

go语言兼容c语言;Go语言可以调用C语言,还能给C语言调用。Go语言工具包中有一个Cgo命令,它用来处理Go调用C相关操作;而Go的函数可以导出给C用,只要在要导出的函数前面加上“//export funcname”就行了,然后可以使用“go build -buildmode=c-shared -o libxxx.so”命令编译生成动态库和头文件供C语言中使用。

go语言兼容c语言吗

本教程操作环境:windows7系统、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参数,如果有需要也可以进行相应设置调整。另外上面的CCCXX是编译工具链的设置,也可以根据需求设置调整。

Go中调用C

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视频教程编程教学

C中调用Go

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

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

在这里插入图片描述
在这里插入图片描述

另外也可以使用go build -buildmode=c-archive -o libxxx.a编译生成可用C语言使用的静态库。

数据类型差异

两个语言间调用其实就是数据的传递处理,需要注意的是因为两者毕竟不是同一种语言所以两者之间可以交互的数据类型是有限制的。有些时候也会有强制转换数据类型的需求,比如下面这个代码:

package rand // #include  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类型数据 }
Salin selepas log masuk

两者间可用的基本数值类型转换有下面一些:

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)
Salin selepas log masuk

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

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

C中函数传输参数为数组的话直接传递数组名就行,在Go中向这类函数传递数组需要传递数组第一个元素的地址,另外需要注意的是数组中元素也必须是C语言中支持的类型:

C.f(&C.arr[0])
Salin selepas log masuk

C中并没有string类型,使用字符串时需要进行处理:

package print // #include  // #include  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)) }
Salin selepas log masuk

另外C语言的字符串*C.char可以使用C.GoString()转换成Go中的字符串。

C中的structunionenum这些类型在Go使用需要加上对应的前缀,变成struct_xxxunion_xxxenum_xxx。其中联合体在Go中将成为字节数组的形式。这些对象的成员名如果和Go的关键词一样的话,在Go中使用需要在成员名前面加下划线,比如x._name

C中的sizeof在Go中需要使用C.sizeof_T方式使用,T是变量数据类型。

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

Atas ialah kandungan terperinci go语言兼容c语言吗. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!