golang之调用C语言代码

简介: 此篇教程只是简单的描述怎么使用以及遇到的一些错误 我写的实例,C语言与golang在同一个文件中,并没有分开。 我这里演示两个例子:⑴ 调用C语言函数打印“Hello World” 1 #include <stdio.

此篇教程只是简单的描述怎么使用以及遇到的一些错误

我写的实例,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”微信公众号

相关文章
|
17天前
|
存储 编译器 C语言
【数据结构】C语言实现链队列(附完整运行代码)
【数据结构】C语言实现链队列(附完整运行代码)
33 0
|
17天前
|
存储 算法 程序员
【数据结构】C语言实现顺序表万字详解(附完整运行代码)
【数据结构】C语言实现顺序表万字详解(附完整运行代码)
35 0
|
29天前
|
算法 安全 C语言
使用C语言实现DES算法代码
使用C语言实现DES算法代码
|
1月前
|
C语言
C语言栈的括号匹配的检验讲解及相关代码
C语言栈的括号匹配的检验讲解及相关代码
28 0
|
1月前
|
算法 C语言
【C语言】三子棋游戏实现代码
【C语言】三子棋游戏实现代码
【C语言】三子棋游戏实现代码
|
1月前
|
C语言
C语言-------扫雷游戏的代码实现
C语言-------扫雷游戏的代码实现
24 0
|
23天前
|
存储 机器学习/深度学习 算法
C语言代码实现数据结构与算法
以上代码中,哈希表使用链表解决哈希冲突,每个链表节点包含一个键值对。hash函数用于计算键值对应的哈希值,insert函数用于向哈希表中插入一个键值对,若当前位置为空,则直接插入;否则,将新节点插入到链表末尾。search函数用于在哈希表中查找指定键值的值,若存在则返回其值,否则返回-1。
32 1
|
1月前
|
存储 算法 程序员
C语言隐藏的代码技巧
C语言隐藏的代码技巧
10 0
|
1月前
|
C语言
C语言一元多项式的表示及相加讲解及相关代码
C语言一元多项式的表示及相加讲解及相关代码
64 0
|
1月前
|
C语言
【C语言】扫雷游戏完整代码实现
【C语言】扫雷游戏完整代码实现