go 调用c语言,golang之调用C语言代码
此篇教程只是簡單的描述怎么使用以及遇到的一些錯誤
我寫的實例,C語言與golang在同一個文件中,并沒有分開。
我這里演示兩個例子:
⑴ 調用C語言函數打印“Hello World”#include?
void?PrintHello(){????printf("Hello?World!\n");
}
c代碼寫好了我們就寫golang代碼import?"C"
func?main()?{
C.PrintHello()
}
輸出結果是:Hello World!
完整代碼package?main??/*
#include?
void?PrintHello(){
printf("Hello?World!\n");
}
*/
import?"C"
func?main()?{
C.PrintHello()
}
請將我這段代碼,原樣復制進行測試,你看到結果就明白了怎么調用C函數了,其中要特別說明的就是:
① C代碼與import "C"之間不能有空格
② import "C"這里的"C"要獨自占一個import,也可以這樣寫
import (
"C"
)
但是不能這樣
import (
"C"
"fmt"
)
③ C代碼是被注釋的狀態;
⑵ 打印給定數組#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)
}
輸出的結果是:[100 1 2 3 4]
全部代碼,復制測試,盡量全部復制,然后再修改代碼進行測試/*??#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)
}
特別說明
按到底打印不需要這么多函數,但是遇到好幾個問題,首先我使用C語言的方式進行傳參:C.PrintArray([1,2,3,4,5], 5),毫無疑問這是會失敗的;第二種方式是使用golang的方式進行,先聲明數組,然后再進行傳參var?b?=?[]C.int{1,2,3,4,5}
C.PrintArray(b,5)
然后就會報下面的錯誤:
cannot use b (type []_Ctype_int) as type *_Ctype_int in argument to _Cfunc_PrintArray
根據錯誤,我們可以看出是類型不統一,說不能使用類型[]_Ctype_int作為函數的參數類型*_Ctype_int;我一看這是需要指針,然后我就進行第三次嘗試;
聲明一個C語言指針,然后開辟空間,然后再逐一賦值:
var b *C.int = C.malloc(C.sizeof(int)*5)
這一次提示的是
could not determine kind of name for C.sizeof
這句話的大概意思就是不能確定類型C.sizeof,我是這樣理解,反正就是不能用,于是我就想到了使用上面那一種方式進行;后面想到需要修改里面的值,于是又寫了一個函數,專門修改數組的值,因為我發現并不能在golang里面直接使用下標進行修改。
作者:吳敬悅
鏈接:https://www.jianshu.com/p/0c7774a328e0
總結
以上是生活随笔為你收集整理的go 调用c语言,golang之调用C语言代码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: html文件打开多出很多数字,【求助】页
- 下一篇: linux 源码目录结构,分析Andro