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

創(chuàng)新互聯(lián)建站專注于三江侗企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站開發(fā),商城開發(fā)。三江侗網(wǎng)站建設(shè)公司,為三江侗等地區(qū)提供建站服務(wù)。全流程按需定制網(wǎng)站,專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,創(chuàng)新互聯(lián)建站專業(yè)和態(tài)度為您提供的服務(wù)
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"語(yǔ)句和前面的C代碼之間不能有空行
運(yùn)行結(jié)果
$ go build main.go ./main
Hello C: 12
Hello Go
分開c代碼到單獨(dú)文件
嵌在一起代碼結(jié)構(gòu)不是很好看,很多人包括我,還是喜歡把兩個(gè)分開,放在不同的文件里面,顯得干凈,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");
}
編譯運(yùn)行
$ go build ./main
Hello C: 12
Hello Go
編譯成庫(kù)文件
如果c文件比較多,最好還是能夠編譯成一個(gè)獨(dú)立的庫(kù)文件,然后go來調(diào)用庫(kù)。
$ find mylib main
mylib
mylib/hello.h
mylib/hello.c
main
main/main.go
編譯庫(kù)文件
$ 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
運(yùn)行
$ export LD_LIBRARY_PATH=../mylib
$ ./main
Hello C: 12
Hello Go
在我們的例子中,庫(kù)文件是編譯成動(dòng)態(tài)庫(kù)的,main程序鏈接的時(shí)候也是采用的動(dòng)態(tài)庫(kù)
$ 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)
理論上講也是可以編譯成整個(gè)一靜態(tài)鏈接的可執(zhí)行程序,由于我的機(jī)器上缺少靜態(tài)鏈接的系統(tǒng)庫(kù),比如libc.a,所以只能編譯成動(dòng)態(tài)鏈接。
沒有這個(gè)語(yǔ)句。
至少我沒聽過,你說的我都用過,這個(gè)真沒有。
而且可以肯定的是:
C語(yǔ)言確實(shí)目前的標(biāo)準(zhǔn)是沒有g(shù)o這個(gè)關(guān)鍵字的。
可以使程序跳轉(zhuǎn)到標(biāo)記位置,可以和if語(yǔ)句構(gòu)成循環(huán),但是對(duì)于goto語(yǔ)句的使用爭(zhēng)議很大,它能使程序很輕松的跳出多個(gè)嵌套循環(huán),但是會(huì)破壞程序的模塊化,使程序的可讀性變差,項(xiàng)目越大這個(gè)缺點(diǎn)越明顯,所以個(gè)人觀點(diǎn)不建議使用,了解就可以了,goto語(yǔ)句的一些用處while和do
while循環(huán)可以代替。
用法舉例:
#include
stdio.h
#include
stdlib.h
int
main()
{
char
input;
loop:
printf("Hello,
world!\n");
printf("Repeat?(y/n)")
scanf("%c",
input);
if
(input
==
'y')
{
goto
loop;
}
system("pause");
return
0;
}
go是用作調(diào)試運(yùn)行的,按F9設(shè)置了設(shè)置斷點(diǎn)之后他會(huì)運(yùn)行到斷點(diǎn)處就停下,然后按
F10
可以一行一行的往下運(yùn)行,按一次向下走一行,這樣容易找到錯(cuò)誤出在什么地方.
那個(gè)紅色的
感嘆號(hào)
就直接運(yùn)行程序,
goto語(yǔ)句可以使程序在沒有任何條件的情況下跳轉(zhuǎn)到指定的位置,所以goto語(yǔ)句又被稱為是無條件跳轉(zhuǎn)語(yǔ)句。
它的語(yǔ)法如下
goto label;
//其它代碼
label:
其中,label為我們自己定義的一個(gè)標(biāo)簽,定義的規(guī)則與變量的命名相同,它的位置是不固定的,它可以寫在goto語(yǔ)句的后面,也可以寫在它的前面,然而goto語(yǔ)句只能在一個(gè)函數(shù)內(nèi)部跳轉(zhuǎn),它并不允許跳轉(zhuǎn)出一個(gè)函數(shù)外部。
int day = 1;
loop:
if (day = 31)
{
printf("%d\n", day);
day++;
goto loop;
}
上面程序就是利用了goto和if語(yǔ)句來實(shí)現(xiàn)了循環(huán)功能,它與while實(shí)現(xiàn)的循環(huán)功能一樣,其中l(wèi)oop為我們定義的一個(gè)label(標(biāo)簽)。
擴(kuò)展資料:
使用goto語(yǔ)句的建議
1) 使用goto語(yǔ)句只能goto到同一函數(shù)內(nèi),而不能從一個(gè)函數(shù)里goto到另外一個(gè)函數(shù)里。
2) 使用goto語(yǔ)句在同一函數(shù)內(nèi)進(jìn)行g(shù)oto時(shí),goto的起點(diǎn)應(yīng)是函數(shù)內(nèi)一段小功能的結(jié)束處,goto的目的label處應(yīng)是函數(shù)內(nèi)另外一段小功能的開始處。
3) 不能從一段復(fù)雜的執(zhí)行狀態(tài)中的位置goto到另外一個(gè)位置,比如,從多重嵌套的循環(huán)判斷中跳出去就是不允許的。
4)應(yīng)該避免向兩個(gè)方向跳轉(zhuǎn)。這樣最容易導(dǎo)致"面條代碼"。
參考資料來源:百度百科-goto語(yǔ)句
goto語(yǔ)句也稱為無條件轉(zhuǎn)移語(yǔ)句,其一般格式如下: goto 語(yǔ)句標(biāo)號(hào); 其中語(yǔ)句標(biāo)號(hào)是按標(biāo)識(shí)符規(guī)定書寫的符號(hào), 放在某一語(yǔ)句行的前面,標(biāo)號(hào)后加冒號(hào)(:)。語(yǔ)句標(biāo)號(hào)起標(biāo)識(shí)語(yǔ)句的作用,與goto 語(yǔ)句配合使用。
如: label: i++;
loop: while(x7);
goto loop;
C語(yǔ)言不限制程序中使用標(biāo)號(hào)的次數(shù),但各標(biāo)號(hào)不得重名。goto語(yǔ)句的語(yǔ)義是改變程序流向, 轉(zhuǎn)去執(zhí)行語(yǔ)句標(biāo)號(hào)所標(biāo)識(shí)的語(yǔ)句。
goto語(yǔ)句通常與條件語(yǔ)句配合使用。可用來實(shí)現(xiàn)條件轉(zhuǎn)移, 構(gòu)成循環(huán),跳出循環(huán)體等功能。
擴(kuò)展資料:
go to在C語(yǔ)言中的應(yīng)用:
統(tǒng)計(jì)從鍵盤輸入一行字符的個(gè)數(shù)。
#includestdio.h
int?n=0;
int?main(void)?{
printf("input?a?string:?");
? loop:?if?(getchar()!='\n')?{
n++;
?goto?loop;
}
printf("output:?%d\n",n);
}
例如輸入:abcdefghijklmnopqrstuvwxyz
然后回車Enter
輸出:26
本例用if語(yǔ)句和goto語(yǔ)句構(gòu)成循環(huán)結(jié)構(gòu)。當(dāng)輸入字符不為'\n'時(shí)即執(zhí)行n++進(jìn)行計(jì)數(shù)。
然后轉(zhuǎn)移至if語(yǔ)句循環(huán)執(zhí)行,直至輸入字符為'\n'才停止循環(huán)。
參考資料:百度百科-go to 語(yǔ)句
本文名稱:c語(yǔ)言調(diào)用go,C語(yǔ)言調(diào)用GPU
URL標(biāo)題:http://chinadenli.net/article0/dsgdhio.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供、建站公司、網(wǎng)站設(shè)計(jì)、品牌網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè)、自適應(yīng)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)