日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

go 调用c语言,golang之调用C语言代码

發(fā)布時(shí)間:2025/3/11 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 go 调用c语言,golang之调用C语言代码 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

此篇教程只是簡單的描述怎么使用以及遇到的一些錯(cuò)誤

我寫的實(shí)例,C語言與golang在同一個(gè)文件中,并沒有分開。

我這里演示兩個(gè)例子:

⑴ 調(diào)用C語言函數(shù)打印“Hello World”#include?

void?PrintHello(){????printf("Hello?World!\n");

}

c代碼寫好了我們就寫golang代碼import?"C"

func?main()?{

C.PrintHello()

}

輸出結(jié)果是:Hello World!

完整代碼package?main??/*

#include?

void?PrintHello(){

printf("Hello?World!\n");

}

*/

import?"C"

func?main()?{

C.PrintHello()

}

請將我這段代碼,原樣復(fù)制進(jìn)行測試,你看到結(jié)果就明白了怎么調(diào)用C函數(shù)了,其中要特別說明的就是:

① C代碼與import "C"之間不能有空格

② import "C"這里的"C"要獨(dú)自占一個(gè)import,也可以這樣寫

import (

"C"

)

但是不能這樣

import (

"C"

"fmt"

)

③ C代碼是被注釋的狀態(tài);

⑵ 打印給定數(shù)組#include?

#include?

void?PrintArray(int?arr[],?int?len){????int?i?=?0;????printf("[");??????for?(i?=?0;?i?

}????printf("]\n");

}??int*?CreateArray(int?len){????int*?arr?=?(int*)malloc(sizeof(int)*len);????int?i?=?0;????for?(i?=?0;?i?

arr[i]?=?i;

}????return?arr;

}??void?SetArrValue(int?*arr,?int?index,?int?value){

arr[index]?=?value;

}

然后是golang代碼import?"C"

func?main()?{

var?b?*C.int?=?C.CreateArray(5)

C.SetArrValue(b,?0,?100)

C.PrintArray(b,?5)

}

輸出的結(jié)果是:[100 1 2 3 4]

全部代碼,復(fù)制測試,盡量全部復(fù)制,然后再修改代碼進(jìn)行測試/*??#include?

#include?

void?PrintArray(int?arr[],?int?len){

int?i?=?0;????printf("[");??????for?(i?=?0;?i?

}????printf("]\n");

}

int*?CreateArray(int?len){

int*?arr?=?(int*)malloc(sizeof(int)*len);

int?i?=?0;????for?(i?=?0;?i?

arr[i]?=?i;

}????return?arr;

}

void?SetArrValue(int?*arr,?int?index,?int?value){

arr[index]?=?value;

}

*/

import?"C"

func?main()?{

var?b?*C.int?=?C.CreateArray(5)

C.SetArrValue(b,?0,?100)

C.PrintArray(b,?5)

}

特別說明

按到底打印不需要這么多函數(shù),但是遇到好幾個(gè)問題,首先我使用C語言的方式進(jìn)行傳參:C.PrintArray([1,2,3,4,5], 5),毫無疑問這是會失敗的;第二種方式是使用golang的方式進(jìn)行,先聲明數(shù)組,然后再進(jìn)行傳參var?b?=?[]C.int{1,2,3,4,5}

C.PrintArray(b,5)

然后就會報(bào)下面的錯(cuò)誤:

cannot use b (type []_Ctype_int) as type *_Ctype_int in argument to _Cfunc_PrintArray

根據(jù)錯(cuò)誤,我們可以看出是類型不統(tǒng)一,說不能使用類型[]_Ctype_int作為函數(shù)的參數(shù)類型*_Ctype_int;我一看這是需要指針,然后我就進(jìn)行第三次嘗試;

聲明一個(gè)C語言指針,然后開辟空間,然后再逐一賦值:

var b *C.int = C.malloc(C.sizeof(int)*5)

這一次提示的是

could not determine kind of name for C.sizeof

這句話的大概意思就是不能確定類型C.sizeof,我是這樣理解,反正就是不能用,于是我就想到了使用上面那一種方式進(jìn)行;后面想到需要修改里面的值,于是又寫了一個(gè)函數(shù),專門修改數(shù)組的值,因?yàn)槲野l(fā)現(xiàn)并不能在golang里面直接使用下標(biāo)進(jìn)行修改。

作者:吳敬悅

鏈接:https://www.jianshu.com/p/0c7774a328e0

總結(jié)

以上是生活随笔為你收集整理的go 调用c语言,golang之调用C语言代码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。