我的编程空间,编程开发者的网络收藏夹
学习永远不晚

go语言兼不兼容c语言

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

go语言兼不兼容c语言

这篇“go语言兼不兼容c语言”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“go语言兼不兼容c语言”文章吧。

go语言兼容c语言;Go语言可以调用C语言,还能给C语言调用。Go语言工具包中有一个Cgo命令,它用来处理Go调用C相关操作;而Go的函数可以导出给C用,只要在要导出的函数前面加上“//export funcname”就行了,然后可以使用“go build -buildmode=c-shared -o libxxx.so”命令编译生成动态库和头文件供C语言中使用。

c语言和golang是兼容的。你用c写的.c文件是可以被golang引用,直接使用的。

现代的各种高级的编程语言很多都是在C语言之上构建的,基本上也都能够调用C语言,并且这个在某些情况下也是有这个需求和存在的意义的。Go语言对这方面支持的挺不错,不光可以调用C语言,还能给C语言调用。这篇文章将对相关的内容做个说明。

基础说明

Go语言工具包中有一个Cgo命令,它用来处理Go调用C相关操作。 我们可以直接使用该命令,也可以在运行或构建Go程序时自动调用它。

Cgo对于C语言的处理本身是依赖系统中C语言相关的编译工具链的,所以需要注意对此的设置,主要是Go的环境变量设置:

go语言兼不兼容c语言

特别需要注意的是Cgo需要使能,可以使用 go env -w CGO_ENABLED=1 命令来设置。上图中可以看到一些C编译时的FLAGS参数,如果有需要也可以进行相应设置调整。另外上面的 CC CXX 是编译工具链的设置,也可以根据需求设置调整。

Go中调用C

Go中调用C语言最终在Go中都显示为名为 C 的伪包, 在Go中 import "C" 行之上以注释 #include ... 方式来引用C语言相关的库。 这些被引用的库中公共的变量和函数等在Go中会被挂到 C 包中以供使用。下面是个简单的演示:

go语言兼不兼容c语言

在Go中调用C只要上面这样就行了,使用起来还是很方便的。

通常来说C语言程序的项目中除了C语言代码外可能还有汇编代码;或者项目也有可能是C/C++混合编程的。这些项目都可以在Go中使用,Cgo会自动识别后缀为 .c .s .S .sx .cc .cpp .cxx 的文件,并调用对应的编译器去编译。

需要注意的是C++中的重载和类方法等C不支持的语法想要在Go中使用都需要用C语言标准函数包装一层,使用方法就和C语言中调用C++一样。

C中调用Go

下面测试中如果有问题可以尝试 go clean 重置项目后再进行。

Go的函数可以导出给C用,只要在要导出的函数前面加上 //export funcname 就行了,然后可以使用 go build -buildmode=c-shared -o libxxx.so 命令编译生成动态库和头文件供C语言中使用:

go语言兼不兼容c语言
go语言兼不兼容c语言

另外也可以使用 go build -buildmode=c-archive -o libxxx.a 编译生成可用C语言使用的静态库。

数据类型差异

两个语言间调用其实就是数据的传递处理,需要注意的是因为两者毕竟不是同一种语言所以两者之间可以交互的数据类型是有限制的。有些时候也会有强制转换数据类型的需求,比如下面这个代码:

package rand// #include <stdlib.h>import "C"func Random() int {    return int(C.random()) // C函数返回值给Go,random的返回值是long类型}func Seed(i int) {    C.srandom(C.uint(i)) // Go传值给C的函数,srandom函数接收uint类型数据}

两者间可用的基本数值类型转换有下面一些:

C.char,       C.schar (signed char),       C.uchar (unsigned char)C.short,       C.ushort (unsigned short)C.int,       C.uint (unsigned int)C.long,       C.ulong (unsigned long)C.longlong (long long),       C.ulonglong (unsigned long long)C.float,       C.doubleC.complexfloat (complex float),       C.complexdouble (complex double)

除了上面的基础类型,指针也是可以传递的。特别的C语言中的 void* 指针相当于Go中的 unsafe.Pointer

C中的 __int128_t__uint128_t 相当于Go中的 [16]byte

C中函数传输参数为数组的话直接传递数组名就行,在Go中向这类函数传递数组需要传递数组第一个元素的地址,另外需要注意的是数组中元素也必须是C语言中支持的类型:

C.f(&C.arr[0])

C中并没有string类型,使用字符串时需要进行处理:

package print// #include <stdio.h>// #include <stdlib.h>import "C"import "unsafe"func Print(s string) {    cs := C.CString(s) // 这个方式会将字符串拷贝一份,返回指针,注意使用完需要释放内存    defer C.free(unsafe.Pointer(cs)) // defer修饰的语句会在该函数退出前执行    C.fputs(cs, (*C.FILE)(C.stdout))}

另外C语言的字符串 *C.char 可以使用 C.GoString() 转换成Go中的字符串。

C中的 struct union enum 这些类型在Go使用需要加上对应的前缀,变成 struct_xxx union_xxx enum_xxx 。其中联合体在Go中将成为字节数组的形式。这些对象的成员名如果和Go的关键词一样的话,在Go中使用需要在成员名前面加下划线,比如 x._name

C中的 sizeof 在Go中需要使用 C.sizeof_T 方式使用,T是变量数据类型。

以上就是关于“go语言兼不兼容c语言”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

go语言兼不兼容c语言

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

go语言兼不兼容c语言

这篇“go语言兼不兼容c语言”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“go语言兼不兼容c语言”文章吧。go语言兼容c语言
2023-07-04

Go语言与C语言的兼容性探究

Go语言与C语言的兼容性探究近年来,Go语言作为一种编程语言在互联网行业中备受瞩目,并逐渐成为开发人员的首选之一。相比之下,C语言作为一种较为传统的编程语言,在系统级开发和性能优化方面依然具有举足轻重的地位。本文将深入探讨Go语言与C语言
Go语言与C语言的兼容性探究
2024-03-08

Go语言是否兼容C语言的特性

Go语言是一种由Google开发的编程语言,它具有简洁、高效、并发支持等特点,逐渐受到广泛关注和应用。在很多情况下,开发者可能需要与C语言进行交互或者利用C语言的特性,这时候就需要考虑Go语言是否兼容C语言的特性。本文将介绍Go语言与C语言
Go语言是否兼容C语言的特性
2024-03-07

深入探讨Go语言对C语言的兼容程度

Go语言是一门由Google开发的编程语言,具有高效、简洁、并发性强等特点。它在语法结构、包管理、高级特性等方面都有很大的优势,因此备受程序员青睐。然而,在实际开发中,很多项目会涉及到与传统的编程语言C进行交互,因此Go语言与C语言的兼容性
深入探讨Go语言对C语言的兼容程度
2024-03-07

Go语言在兼容C语言方面的优势与挑战

Go语言在兼容C语言方面的优势与挑战在软件开发领域,C语言一直以来都是被广泛应用的一种语言,其高效性和灵活性被认为是其他语言所无法替代的。然而,随着时代的变迁,更多的开发者开始关注到Go语言,这也导致了Go语言在兼容C语言方面的讨论日益频
Go语言在兼容C语言方面的优势与挑战
2024-03-08

C语言开发者是否容易转向Go语言:兼容性分析

C语言开发者是否容易转向Go语言:兼容性分析随着时代的变迁,编程语言的发展也在不断地演进。作为一名C语言开发者,是否容易转向使用Go语言呢?本文将从兼容性的角度进行分析,并提供具体的代码示例,帮助读者更好地理解两种语言之间的联系和差异。
C语言开发者是否容易转向Go语言:兼容性分析
2024-03-07

掌握Canvas的跨语言兼容性

随着互联网的快速发展,Web技术也在不断更新与演进。其中,HTML5标准的制定对于Web开发者来说,无疑是一个重大的进步。而HTML5的一个重要特性就是Canvas元素,它提供了一种使用JavaScript脚本进行绘制图形的方法。作为一个具
掌握Canvas的跨语言兼容性
2024-01-17

揭秘:鸿蒙是否兼容 Go 语言的真相

鸿蒙系统当前官方不支持 go 语言,但实际测试表明可在鸿蒙设备上编译和运行 go 程序。需要注意,由于缺乏官方支持,使用 go 语言可能会存在兼容性问题。揭秘:鸿蒙是否兼容 Go 语言的真相引言随着鸿蒙操作系统的发布,其支持的编程语言备
揭秘:鸿蒙是否兼容 Go 语言的真相
2024-04-08

C++ 函数与 C 语言函数的兼容性如何?

c++++ 兼容 c 语言函数,但在函数声明、参数重载、返回类型和参数传递方式上存在细微差别。此外,c++ 提供了异常处理机制。C++ 函数与 C 语言函数的兼容性C++ 语言是 C 语言的超集,这意味着 C++ 能够兼容 C 语言的函数
C++ 函数与 C 语言函数的兼容性如何?
2024-04-11

C++ 函数指针与 C 兼容性:无缝桥接两种语言

c++++ 函数指针与 c 兼容,允许在两种语言之间无缝传递和存储函数。尽管声明语法略有不同(c++ 要求使用圆括号和引用运算符),c++ 函数指针与 c 函数指针兼容,可以相互传递。这在移植 c 库时非常有用,可以通过函数指针轻松集成 c
C++ 函数指针与 C 兼容性:无缝桥接两种语言
2024-04-29

ASP语法与其他语言:探索兼容性和互操作性

ASP语法作为微软公司的主要脚本语言,它具有一定的兼容性和互操作性,这使得它能够与其他语言一起协同工作或对其进行扩展。本文将探讨ASP语法与其他语言的兼容性和互操作性,通过演示代码来帮助读者理解如何实现不同语言之间的协同工作。
ASP语法与其他语言:探索兼容性和互操作性
2024-02-21

go语言是不是易语言

本篇内容介绍了“go语言是不是易语言”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!go语言不是易语言,两者是不同的编程语言。go语言(又称G
2023-07-04

Go语言与C语言有哪些不同之处

这篇文章将为大家详细讲解有关Go语言与C语言有哪些不同之处,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。C 的语法首先,先看看 C 的语法。C 采用了一种聪明而不同寻常的声明语法。声明变量时,只需写出一个
2023-06-16

go语言和c语言是什么

这篇文章主要介绍了go语言和c语言是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇go语言和c语言是什么文章都会有所收获,下面我们一起来看看吧。Go(又称Golang)是Google开发的一种静态强类型、编
2023-07-04

go语言怎么调用c语言

Go语言可以通过使用cgo工具以及一些特定的语法来调用C语言代码。以下是调用C语言的Go代码示例:创建一个名为 `callc.go` 的Go文件。package main/*#include // 声明一个外部的C函数extern v
2023-10-27

go语言是不是编程语言

本篇内容介绍了“go语言是不是编程语言”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!go语言是编程语言。go语言又称Golang,是Goog
2023-07-04

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录