源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

在Golang中使用C语言代码实例

  • 时间:2020-01-28 05:06 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:在Golang中使用C语言代码实例
cgo 使得在 Golang 中可以使用 C 代码。 [b]Hello World[/b] 为了有一个较为直观的了解,我们来看一个简单的例子,创建文件 main.go:
[url=http://golang.org/pkg/go/build/#hdr-Build_Constraints]http://golang.org/pkg/go/build/#hdr-Build_Constraints[/url]。 常用的 #cgo 指令有: 1.CPPFLAGS、CFLAGS 指令被用于编译当前包中的 C 文件(任何的 .c、.s、.S 文件) 2.CPPFLAGS、CXXFLAGS 指令被用于编译当前包中的 C++ 文件(任何的 .cpp、.cc、.cxx 文件) 3.LDFLAGS 指令用于指定链接器标志 4.pkg-config 指令用于通过 pkg-config 工具获取编译器和链接器标志(例如:#cgo pkg-config: png cairo) [b]Golang 引用 C[/b] 结构体上需要注意的点: 1.C 结构体的域名称如果为 Golang 的关键字时,访问时需要在域名称前面加上 _。比如说,C 中有一个结构体变量 x,此变量对应的结构体中有一个域 type,那么在 Golang 中需要通过 x._type 来访问 type 域 2.结构体的位域、非对齐数据等无法在 Golang 中表示时会被忽略 3.Golang 结构体中不能使用 C 类型的域 标准的 C 数值类型对应: 1.C.char 2.C.schar(signed char) 3.C.uchar(unsigned char) 4.C.short 5.C.ushort(unsigned short) 6.C.int 7.C.uint(unsigned int) 8.C.long 9.C.ulong(unsigned long) 10.C.longlong(long long) 11.C.ulonglong(unsigned long long) 12.C.float 13.C.double 任何的 C 函数(包括 void 函数)都可以返回一个返回值和 C 的 errno 变量(作为错误):
[u]复制代码[/u] 代码如下:
n, err := C.sqrt(-1) _, err := C.voidFunc()
直接调用 C 函数指针目前还无法支持。 有一些特殊的函数可以用于 C 类型和 Golang 类型之间转换(通过数据拷贝的方式),伪定义如下:
[u]复制代码[/u] 代码如下:
// Golang 的字符串转为 C 字符串 // C 的字符串是使用 malloc 分配的,因此,此函数的调用者 // 需要调用 C.free 来释放内存 func C.CString(string) *C.char   // 转换 C 字符串到 Golang 字符串 func C.GoString(*C.char) string   // 转换一定长度的 C 字符串到 Golang 字符串 func C.GoStringN(*C.char, C.int) string   // 转换一块 C 内存区域到 Golang 的字节数组中去 func C.GoBytes(unsafe.Pointer, C.int) []byte
[b]其他需要注意的点:[/b] 1.C 语言中的 void* 对应 unsafe.Pointer 2.C 语言中的结构、联合、枚举类型(而非变量),在 Golang 中需要加上 struct_、union_、enum_ 前缀访问。由于 Golang 中没有联合这种数据类型,因此 C 的联合在 Golang 中被表示为字节数组 3.和 C 语言等价的那些类型是不可以导出的
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部