go 调用c语言,golang之调用C语言代码
此篇教程只是簡單的描述怎么使用以及遇到的一些錯(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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: html文件打开多出很多数字,【求助】页
- 下一篇: 识别产品外观的合格软件_你还在犹豫?外观