go语言兼不兼容c语言


这篇“go语言兼不兼容c语言”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“go语言兼不兼容c语言”文章吧。 go语言兼容c语言;Go语言可以调用C语言,还能给C语言调用。Go语言工具包中有一个Cgo命令,它用来处理Go调用C相关操作;而Go的函数可以导出给C用,只要在要导出的函数前面加上“//export funcname”就行了,然后可以使用“go build -buildmode=c-shared -o libxxx.so”命令编译生成动态库和头文件供C语言中使用。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 clean 重置项目后再进行。Go的函数可以导出给C用,只要在要导出的函数前面加上 //export funcname 就行了,然后可以使用 go build -buildmode=c-shared -o libxxx.so 命令编译生成动态库和头文件供C语言中使用:
另外也可以使用 go build -buildmode=c-archive -o libxxx.a 编译生成可用C语言使用的静态库。两个语言间调用其实就是数据的传递处理,需要注意的是因为两者毕竟不是同一种语言所以两者之间可以交互数据类型是有限制的。有些时候也会有强制转换数据类型的需求,比如下面这个代码:

packagerand

//#include
import"C"

funcRandom()int{
returnint(C.random())//C函数返回值给Go,random的返回值是long类型
}

funcSeed(iint){
C.srandom(C.uint(i))//Go传值给C的函数,srandom函数接收uint类型数据
}

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

C.char,C.schar(signedchar),C.uchar(unsignedchar)
C.short,C.ushort(unsignedshort)
C.int,C.uint(unsignedint)
C.long,C.ulong(unsignedlon免费云主机域名g)
C.longlong(longlong),C.ulonglong(unsignedlonglong)
C.float,C.double
C.complexfloat(complexfloat),C.complexdouble(complexdouble)

除了上面的基础类型,指针也是可以传递的。特别的C语言中的 void* 指针相当于Go中的 unsafe.Pointer 。C中的 __int128_t__uint128_t 相当于Go中的 [16]byte 。C中函数传输参数为数组的话直接传递数组名就行,在Go中向这类函数传递数组需要传递数组第一个元素的地址,另外需要注意的是数组中元素也必须是C语言中支持的类型:

C.f(&C.arr[0])

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

packageprint

//#include
//#include
import"C"
import"unsafe"

funcPrint(sstring){
cs:=C.CString(s)//这个方式会将字符串拷贝一份,返回指针,注意使用完需要释放内存
deferC.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语言”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注百云主机行业资讯频道。

相关推荐: vue中使用slot与slot-scope有什么区别

本文小编为大家详细介绍“vue中使用slot与slot-scope有什么区别”,内容详细,步骤清晰,细节处理妥当,希望这篇“vue中使用slot与slot-scope有什么区别”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。单个插槽 …

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 03/01 18:43
下一篇 03/01 18:46

相关推荐