麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > Golang > 正文

在Golang中使用C語言代碼實例

2020-04-01 19:26:07
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了在Golang中使用C語言代碼實例,本文先是給出了一個Hello World例子、Golang 引用 C例子,并總結了一些要注意的地方,需要的朋友可以參考下
 

cgo 使得在 Golang 中可以使用 C 代碼。

Hello World

為了有一個較為直觀的了解,我們來看一個簡單的例子,創建文件 main.go:

復制代碼代碼如下:

package main
 
/*
#include <stdio.h>
 
void sayHi() {
    printf("Hi");
}
*/
import "C"
 
func main() {
    C.sayHi()
}

執行程序:
復制代碼代碼如下:

go run main.go

程序執行并輸出 hi(更多的范例可以見 $GOROOT/misc/cgo)。

 

Windows 下的準備工作

如果想要在 Windows 上使用 cgo,那么需要安裝 gcc 編譯器,這里我使用 mingw-w64。

設置編譯和鏈接標志

我們使用 import “C” 導入的是一個偽包(pseudo-package),我們通過其來使用 C 代碼。在 import “C” 之前,緊跟著 import “C” 的注釋可以包括:

1.編譯器和鏈接器標志
2.C 代碼

我們可以通過 #cgo 指令來設置編譯器和鏈接器標志,例如:

復制代碼代碼如下:

// #cgo CFLAGS: -DPNG_DEBUG=1
// #cgo amd64 386 CFLAGS: -DX86=1
// #cgo LDFLAGS: -lpng
// #include <png.h>
import "C"

 

附帶提及一點的是,這些指令中可以包含構建約束(build constraint),詳細內容見:http://golang.org/pkg/go/build/#hdr-Build_Constraints。

常用的 #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)

Golang 引用 C

結構體上需要注意的點:

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 變量(作為錯誤):

復制代碼代碼如下:

n, err := C.sqrt(-1)
_, err := C.voidFunc()

 

直接調用 C 函數指針目前還無法支持。

有一些特殊的函數可以用于 C 類型和 Golang 類型之間轉換(通過數據拷貝的方式),偽定義如下:

 

復制代碼代碼如下:

// 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

 

其他需要注意的點:

1.C 語言中的 void* 對應 unsafe.Pointer
2.C 語言中的結構、聯合、枚舉類型(而非變量),在 Golang 中需要加上 struct_、union_、enum_ 前綴訪問。由于 Golang 中沒有聯合這種數據類型,因此 C 的聯合在 Golang 中被表示為字節數組
3.和 C 語言等價的那些類型是不可以導出的


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 精品久久久久久久久久久久久久 | 欧美性受ⅹ╳╳╳黑人a性爽 | 欧美亚洲一区二区三区四区 | 97久久人人超碰caoprom | 国产乱轮视频 | 免费在线观看毛片视频 | 黄网站在线播放视频免费观看 | 国产午夜精品一区二区三区四区 | 国产一区网址 | 欧美视频在线一区二区三区 | 欧美一级淫片免费视频1 | 亚洲va久久久噜噜噜久牛牛影视 | 狠狠婷婷综合久久久久久妖精 | 黄色视屏免费看 | 欧美日韩中文字幕在线 | 欧美黄色片免费看 | 奶子吧naiziba.cc免费午夜片在线观看 | 久久久久北条麻妃免费看 | a级黄色片视频 | 精品一区二区6 | 久久精品小短片 | 亚洲成人精品久久久 | 自拍亚洲伦理 | 久久中文免费 | 激情大乳女做爰办公室韩国 | 空姐一级毛片 | 免费视频xxxx | 日韩中字在线 | 粉嫩粉嫩一区二区三区在线播放 | 精品av在线播放 | 久久精品视频12 | 免费看a级片 | 一区二区三区欧美在线 | 丁香天堂网| 午夜视频福利 | 久久精品视频免费观看 | 黄视频网站免费观看 | 中文字幕在线观看网址 | 亚洲第一视频在线 | 久久伊 | 久久久久国产成人免费精品免费 |