老熟女激烈的高潮_日韩一级黄色录像_亚洲1区2区3区视频_精品少妇一区二区三区在线播放_国产欧美日产久久_午夜福利精品导航凹凸

重慶分公司,新征程啟航

為企業提供網站建設、域名注冊、服務器等服務

go編譯庫給c語言返回值 go語言 c語言

C語言中返回值

首先,C語言中的函數有兩種形式:1)有返回值,2)無返回值。有返回值的函數會把執行的結果(也就是你寫這個函數的目的)返回到主函數中。沒有返回值的函數主要是為了完成某世簡種任務(其實這是廢話,函數爛羨的功能就是為了完成某種任務。)而一般沒有任何值返回到主函數中(也可以通過在無返回值的函數中操作全局變量來改變主函數中的變量的值)。函數聲明的方式是:

創新互聯公司專注于什邡企業網站建設,成都響應式網站建設公司,商城開發。什邡網站建設公司,為什邡等地區提供建站服務。全流程定制開發,專業設計,全程項目跟蹤,創新互聯公司專業和態度為您提供的服務

Type FunctionName(type argument1,type argument2....type argumentn)

{

//函數體

}

type 可以為任意的C語言中的數據類型。也可以為VOID(即無返回值)。

其次,main函數的前面可以為int也可以為void.因饑返拍為main函數也是函數(廢話)。當這個函數執行完畢之后會返回給系統一個值,0表示正確(常)執行。如果你寫void的話,編譯調試的時候,編譯器會自動像系統返回一個值。

第三,在寫C++程序的時候一般寫:

int main()

{

....

....

return 0;

}

golang c.cstring 返回的是什么類型

可以用注釋符//和/**/包枯敗圍C代碼

import “C” 和包含C代碼之間是沒有空行的

動態庫的導入和編譯選項通過LDFLAGS、CFLAGS/CXXFLAGS來設置

還可以用pkg-config #cgo pkg-config : xxxxname

編譯宏定義指定#cgo CFLAGS: -DNDEBUG -DXXXX=2

??今薯褲天先看看go和c之間的類型轉換:

char -- C.char -- byte

signed char -- C.schar -- int8

unsigned char -- C.uchar -- uint8

short int -- C.short -- int16

short unsigned int -- C.ushort --沒手顫 uint16

go語言如何調用c函數

直接嵌入c源代碼到go代碼里面

package main

/*

#include stdio.h

void myhello(int i) {

printf("Hello C: %d\n", i);

}

*/

import "C"

import "fmt"

func main() {

C.myhello(C.int(12))

fmt.Println("Hello Go");

}

需要注意的是C代碼必須放在注釋里面

import "C"語句和前面的C代碼之間不能有空行

運行結果

$ go build main.go ./main

Hello C: 12

Hello Go

分開c代碼到單獨文件

嵌在一起代碼結構不是很好看,很多人包括我,還是喜歡把兩個分開,放在不同的文件里面,顯得干凈,go源文件里面是go的源代碼,c源文件里面是c的源代碼。

$ ls

hello.c hello.h main.go

$ cat hello.h

void hello(int);

$ cat hello.c

#include stdio.h

void hello(int i) {

printf("Hello C: %d\n", i);

}

$ cat main.go

package main

// #include "hello.h"

import "C"

import "fmt"

func main() {

C.hello(C.int(12))

fmt.Println("Hello Go");

}

編譯運行

$ go build ./main

Hello C: 12

Hello Go

編譯成庫文件

如果c文件比較多,最好還是能夠編譯成一個獨立的庫文件,然后go來調用庫。

$ find mylib main

mylib

mylib/hello.h

mylib/hello.c

main

main/main.go

編譯庫文件

$ cd mylib

# gcc -fPIC -shared -o libhello.so hello.c

編譯go程序

$ cd main

$ cat main.go

package main

// #cgo CFLAGS: -I../mylib

// #cgo LDFLAGS: -L../mylib -lhello

// #include "hello.h"慎氏

import "C"

import "fmt"

func main() {

C.hello(C.int(12))

fmt.Println("Hello Go");

}

$ go build main.go

運行

$ export LD_LIBRARY_PATH=../mylib

$ ./main

Hello C: 12

Hello Go

在我們的例子中,庫文件是編譯成動態庫的,main程序鏈接的時候也是采用的動態庫局孝禪

$ ldd main

linux-vdso.so.1 = (0x00007fffc7968000)

libhello.so = ../mylib/libhello.so (0x00007f513684c000)

libpthread.so.0 = /lib64/libpthread.so.0 (0x00007f5136614000)

libc.so.6 = /lib64/libc.so.6 (0x00007f5136253000)

/lib64/ld-linux-x86-64.so.2 (0x000055d819227000)

理論上講也是可以編譯成整個一靜態鏈接的可執行程序,由于我的機器上缺少靜態鏈接的系統庫,比如libc.a,所以只能編譯成動態鏈接桐塵。

如何在golang 中調用c的靜態庫或者動態庫

Cgo 使得Go程序能夠調用C代碼. cgo讀入一個用特別的格式寫的Go語言源文件, 輸出Go和C程序, 使得C程序能打包到Go語言的程序包中.

舉例說明一下. 下面是一個Go語言包, 包含了兩個函數 -- Random 和 Seed -- 是C語言庫中random和srandom函數的馬甲.

package rand

/*

#include stdlib.h

*/ import "C" func Random() int { return int(C.random()) } func Seed(i int) { C.srandom(C.uint(i)) }

我們來看一下這里都有什么內容. 開始是一個包的導入語句.

rand包導入了"C"包, 但你會發現在Go的標準庫里沒有這個包. 那是因為C是一個"偽包", 一個為cgo引入的特殊的包名, 它是C命名空間的一個引用.

rand 包包舉殲磨含4個到C包的引用: 調用 C.random和C.srandom, 類型轉換 C.uint(i)還有引用語句.

Random函數調用libc中的random函數, 然后回返結果. 在C中, random返回一個C類型的長整形值, cgo把它輪換為C.long. 這個值必需轉換成Go的類型, 才能在Go程序中使用. 使用一個常見的Go類型轉換:

func Random() int { return int(C.random()) }

這是一個等價的函數, 使用了一個臨時變量來進行類型轉換:

func Random() int { var r C.long = C.random() return int(r) }

Seed函數則相反. 它接受一個Go語言的int類型, 轉換成C語言的unsigned int類型, 然后傳遞給C的srandom函數.

func Seed(i int) { C.srandom(C.uint(i)) }

需要注意的是, cgo中的unsigned int類型寫為正斗C.uint; cgo的文檔中有完整的類型列表.

這個例子中還有一個細節我們沒有說到, 那就是導入語句上面的注釋.

/*

#include stdlib.h

*/ import "C"

Cgo可以識別這個改唯注釋, 并在編譯C語言程序的時候將它當作一個頭文件來處理. 在這個例子中, 它只是一個include語句, 然而其實它可以是使用有效的C語言代碼. 這個注釋必需緊靠在import "C"這個語句的上面, 不能有空行, 就像是文檔注釋一樣.

Strings and things

與Go語言不同, C語言中沒有顯式的字符串類型. 字符串在C語言中是一個以0結尾的字符數組.

Go和C語言中的字符串轉換是通過C.CString, C.GoString,和C.GoStringN這些函數進行的. 這些轉換將得到字符串類型的一個副本.

下一個例子是實現一個Print函數, 它使用C標準庫中的fputs函數把一個字符串寫到標準輸出上:

package print // #include stdio.h // #include stdlib.h import "C" import "unsafe" func Print(s string) { cs := C.CString(s) C.fputs(cs, (*C.FILE)(C.stdout)) C.free(unsafe.Pointer(cs)) }

在C程序中進行的內存分配是不能被Go語言的內存管理器感知的. 當你使用C.CString創建一個C字符串時(或者其它類型的C語言內存分配), 你必需記得在使用完后用C.free來釋放它.

調用C.CString將返回一個指向字符數組開始處的指錯, 所以在函數退出前我們把它轉換成一個unsafe.Pointer(Go中與C的void 等價的東西), 使用C.free來釋放分配的內存. 一個慣用法是在分配內存后緊跟一個defer(特別是當這段代碼比較復雜的時候), 這樣我們就有了下面這個Print函數:

func Print(s string) { cs := C.CString(s) defer C.free(unsafe.Pointer(cs)) C.fputs(cs, (*C.FILE)(C.stdout)) }

構建 cgo 包

如果你使用goinstall, 構建cgo包就比較容易了, 只要調用像平常一樣使用goinstall命令, 它就能自動識別這個特殊的import "C", 然后自動使用cgo來編譯這些文件.

如果你想使用Go的Makefiles來構建, 那在CGOFILES變量中列出那些要用cgo處理的文件, 就像GOFILES變量包含一般的Go源文件一樣.

rand包的Makefile可以寫成下面這樣:

include $(GOROOT)/src/Make.inc

TARG=goblog/rand

CGOFILES=\ rand.go\ include $(GOROOT)/src/Make.pkg

然后輸入gomake開始構建.

更多 cgo 的資源

cgo的文檔中包含了關于C偽包的更多詳細的說明, 以及構建過程. Go代碼樹中的cgo的例子給出了更多更高級的用法.

一個簡單而又符合Go慣用法的基于cgo的包是Russ Cox寫的gosqlite. 而Go語言的網站上也列出了更多的的cgo包.

最后, 如果你對于cgo的內部是怎么運作這個事情感到好奇的話, 去看看運行時包的cgocall.c文件的注釋吧.


文章標題:go編譯庫給c語言返回值 go語言 c語言
網頁網址:http://www.xueling.net.cn/article/ddpiogh.html

其他資訊

在線咨詢
服務熱線
服務熱線:028-86922220
TOP
主站蜘蛛池模板: 精品人伦一区二区三区潘金莲 | 中文字幕视频免费在线观看 | 国模欢欢炮交啪啪150 | 久久厕所偷拍视频 | 中文高清少妇免费 | 国产精彩在线视频 | 1769国内精品视频在线播放 | yell视频在线观看免费 | 成人久久18免费网站 | 久久国产中文娱乐网 | 久久综合亚洲色HEZYO社区 | 91美剧| 99久久国语露脸精品国产 | 91看剧| 亚洲aⅴ久久精品蜜桃 | 亚洲美女又黄又爽在线观看 | 国产乱码日产乱码精品精 | 久久久性视频 | 一本一本久久A久久精品综合不卡 | 国产91视频网 | 国产精品国产三级国产专播i12 | 欧美丰满少妇XXXX性 | 久久草在线观看视频 | 少妇人妻真实偷人精品视频 | av在线一区二区三区四区 | 人妻少妇精品一区二区三区 | 国产中文字幕免费 | 国产亚洲精品久久久久久久 | 玩弄少妇人妻中文字幕 | 制服丝袜自拍另类第1页 | 伊人久久综在合线亚洲2019 | 国产ts人妖系列高潮 | 免费在线国产精品 | 国产区在线视频 | 草草影院在线 | 最新大地资源网在线观看免费 | 黄网站欧美内射 | 国产精品久久久久久久久久10秀 | 亚洲AV乱码久久精品蜜桃 | 国产香蕉伊蕉伊中文在线视频 | 性做爰片免费视频毛片中文 |