golang之調用C語言代碼

此篇教程只是簡單的描述怎麼使用以及遇到的一些錯誤

我寫的實例,C語言與golang在同一個文件中,並沒有分開。

我這裏演示兩個例子:
⑴ 調用C語言函數打印“Hello World”

1  #include <stdio.h>
2  void PrintHello(){
3    printf("Hello World!\n");
4  }

c代碼寫好了我們就寫golang代碼

1   import "C"
2  func main() {
3      C.PrintHello()
4  }

輸出結果是:Hello World!

完整代碼

 1 package main
 2  /*
 3  #include <stdio.h>
 4  void PrintHello(){
 5      printf("Hello World!\n");
 6  }
 7  */
 8  import "C"
 9  func main() {
10      C.PrintHello()
11  }

請將我這段代碼,原樣複製進行測試,你看到結果就明白了怎麼調用C函數了,其中要特別說明的就是:
① C代碼與import "C"之間不能有空格
② import "C"這裏的"C"要獨自佔一個import,也可以這樣寫
import (
"C"
)
但是不能這樣
import (
"C"
"fmt"
)
③ C代碼是被註釋的狀態;
⑵ 打印給定數組

 1#include <stdio.h>
 2  #include <stdlib.h>
 3  void PrintArray(int arr[], int len){
 4    int i = 0;
 5    printf("[");
 6      for (i = 0; i < len; i++){
 7        if (i == len - 1) printf("%d",arr[i]);
 8        else printf("%d ",arr[i]);
 9    }
10    printf("]\n");
11  }
12  int* CreateArray(int len){
13    int* arr = (int*)malloc(sizeof(int)*len);
14    int i = 0;
15    for (i = 0; i < len; i ++) {
16        arr[i] = i;
17    }
18    return arr;
19  }
20  void SetArrValue(int *arr, int index, int value){
21    arr[index] = value;
22  }

然後是golang代碼

1  import "C"
2  func main() {
3    var b *C.int = C.CreateArray(5)
4    C.SetArrValue(b, 0, 100)
5    C.PrintArray(b, 5)
6  }

輸出的結果是:[100 1 2 3 4]
全部代碼,複製測試,儘量全部複製,然後再修改代碼進行測試


 1/*
 2  #include <stdio.h>
 3  #include <stdlib.h>
 4  void PrintArray(int arr[], int len){
 5    int i = 0;
 6    printf("[");
 7      for (i = 0; i < len; i++){
 8        if (i == len - 1) printf("%d",arr[i]);
 9        else printf("%d ",arr[i]);
10    }
11    printf("]\n");
12  }
13  int* CreateArray(int len){
14    int* arr = (int*)malloc(sizeof(int)*len);
15    int i = 0;
16    for (i = 0; i < len; i ++) {
17        arr[i] = i;
18    }
19    return arr;
20  }
21  void SetArrValue(int *arr, int index, int value){
22    arr[index] = value;
23  }
24  */
25  import "C"
26  func main() {
27    var b *C.int = C.CreateArray(5)
28    C.SetArrValue(b, 0, 100)
29    C.PrintArray(b, 5)
30  }
31

特別說明
按到底打印不需要這麼多函數,但是遇到好幾個問題,首先我使用C語言的方式進行傳參:C.PrintArray([1,2,3,4,5], 5),毫無疑問這是會失敗的;第二種方式是使用golang的方式進行,先聲明數組,然後再進行傳參


1var b = []C.int{1,2,3,4,5}
2  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裏面直接使用下標進行修改。

原文發佈時間爲:2018-12-16
本文作者:Golang語言社區
本文來自雲棲社區合作伙伴“ Golang語言社區”,瞭解相關信息可以關注“Golangweb”微信公衆號

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章