C语言与C++语言相互调用

简介: C语言与C++语言相互调用 1 C++调用C中的函数   1.1 C++调用C中的函数(正确使用)   1、案例源文件组成                                               图1   2、math模块包含文件   1)源文件math.

C语言与C++语言相互调用

1 C++调用C中的函数
 

1.1 C++调用C中的函数(正确使用)
 

1、案例源文件组成


                                              图1

 

2、math模块包含文件
 

1)源文件math.c



                                              图2

2)头文件math.h



                                                     图3

 

3、主模块包含文件
 

1)源文件main.cpp

 



                                                        图4

2)头文件module.h

 



                                                     图5

 

4、编译math模块
 



                                                                 图6

 

5、编译主模块
 



                                                                   图7

6、链接
 



                                                            图8a

 

 



                                                               图8b

 

 

 

1.2 C++调用C中的函数(非正确使用)
1、案例源文件组成


                                                           图9

 

2、math模块包含文件
1)源文件math.c



                                                          图10

2)头文件math.h



                                                             图11

 

 

 

3、主模块包含文件
1)源文件main.cpp



                               图12

2)头文件module.h



                                                        图13

图13与图5内容差异为:图13屏蔽了exterrn “C” {}

 

4、编译math模块


                                                                     图14

 

5、编译主模块


                                                                                 图15

图15与图7中内容差异:图7中的函数符号为add_func,而图15中的函数符号为_Z8add_funcii

因C++为面向对象语言,存在多态性,在编译时会将函数参数类型和个数一并加入符号中,其中_Z8add_funcii中的ii为表示有两个参数,并且参数类型为integer型。

6、链接


                                                                 图16

 

 

 

 

2 C调用C++中的函数
 

2.1 C调用C++中的函数(正确使用)
 

1、源码结构


                                                 图1

 

2、math模块
1)math.h文件



                                      图2

2)math.cpp



                             图3

3)编译math模块



                                                                  图4

 

4)查看math.o中符号内容

 



                                                                图5

3、主模块
1)module.h



                                 图6

2)main.c



                                       图7

3)编译主模块



                                                          图8

4)查看main.o中符号



                                                              图9

4、链接(math.o和main.o)


                                                           图10

 

2.2 C调用C++中的函数(非正确使用)
1、源文件结构


                                               图1

2、math模块
1)math.h文件



                             图2

2)math.cpp文件



                             图3 

3)编译math模块



                                                          图4

4)查看math.o中的符号

 



                                                                 图5

 

3、主模块
1)module.h



                                       图6

2)main.c



                                     图7

3)编译主模块



                                                   图8

4)查看main.o中符号



                                                              图9

 

4、链接(math.o和main.o)
 



                                                        图10 

 

 

 

 

3 总结
C++保留了一部分过程式语言特点,因此可以定义不属于任何类的全局变量和函数;但是C++为面向对象语言,支持函数的重载,C++对全局函数处理方式明显与C不同。extern “C”{}目的是为了让C++正确使用C的代码,加上extern “C”{}之后,会指示编译器对这部分代码按照C语言进行编译,而不是C++。C++支持多态,因此编译过程中会将函数的参数类型合入函数名符号中,而不仅仅是函数名。

__cplusplus为cpp中自定义的宏,extern表明变量和函数是全局性的。

主意:

1)C++调用一个C语言编写的.so库时,包含描述.so库中函数的头文件时,应该将对应的头文件放置在extern “C”{}格式的{}中,。

2)C中引用C++中的全局函数时,C++的头文件需要加extern “C”,而C文件中不能用extern “C”,只能使用extern关键字。
--------------------- 
作者:yanlaifan 
来源:CSDN 
版权声明:本文为博主原创文章,转载请附上博文链接!
相关文章
|
4月前
|
存储 C++
C++语言中指针变量int和取值操作ptr详细说明。
总结起来,在 C++ 中正确理解和运用 int 类型地址及其相关取值、设定等操纵至关重要且基础性强:定义 int 类型 pointer 需加星号;初始化 pointer 需配合 & 取址;读写 pointer 执向之处需配合 * 解引用操纵进行。
408 12
|
9月前
|
存储 负载均衡 算法
基于 C++ 语言的迪杰斯特拉算法在局域网计算机管理中的应用剖析
在局域网计算机管理中,迪杰斯特拉算法用于优化网络路径、分配资源和定位故障节点,确保高效稳定的网络环境。该算法通过计算最短路径,提升数据传输速率与稳定性,实现负载均衡并快速排除故障。C++代码示例展示了其在网络模拟中的应用,为企业信息化建设提供有力支持。
260 15
|
5月前
|
安全 C语言 C++
比较C++的内存分配与管理方式new/delete与C语言中的malloc/realloc/calloc/free。
在实用性方面,C++的内存管理方式提供了面向对象的特性,它是处理构造和析构、需要类型安全和异常处理的首选方案。而C语言的内存管理函数适用于简单的内存分配,例如分配原始内存块或复杂性较低的数据结构,没有构造和析构的要求。当从C迁移到C++,或在C++中使用C代码时,了解两种内存管理方式的差异非常重要。
191 26
|
安全 编译器 C语言
C++入门1——从C语言到C++的过渡
C++入门1——从C语言到C++的过渡
243 2
|
9月前
|
存储 算法 安全
企业员工数据泄露防范策略:基于 C++ 语言的布隆过滤器算法剖析[如何防止员工泄密]
企业运营过程中,防范员工泄密是信息安全领域的核心议题。员工泄密可能致使企业核心数据、商业机密等关键资产的流失,进而给企业造成严重损失。为应对这一挑战,借助恰当的数据结构与算法成为强化信息防护的有效路径。本文专注于 C++ 语言中的布隆过滤器算法,深入探究其在防范员工泄密场景中的应用。
194 8
|
10月前
|
监控 Linux PHP
【02】客户端服务端C语言-go语言-web端PHP语言整合内容发布-优雅草网络设备监控系统-2月12日优雅草简化Centos stream8安装zabbix7教程-本搭建教程非docker搭建教程-优雅草solution
【02】客户端服务端C语言-go语言-web端PHP语言整合内容发布-优雅草网络设备监控系统-2月12日优雅草简化Centos stream8安装zabbix7教程-本搭建教程非docker搭建教程-优雅草solution
322 20
|
10月前
|
监控 关系型数据库 MySQL
【01】客户端服务端C语言-go语言-web端PHP语言整合内容发布-优雅草网络设备监控系统-硬件设备实时监控系统运营版发布-本产品基于企业级开源项目Zabbix深度二开-分步骤实现预计10篇合集-自营版
【01】客户端服务端C语言-go语言-web端PHP语言整合内容发布-优雅草网络设备监控系统-硬件设备实时监控系统运营版发布-本产品基于企业级开源项目Zabbix深度二开-分步骤实现预计10篇合集-自营版
291 0
|
12月前
|
Unix 编译器 C语言
[oeasy]python052_[系统开发语言为什么默认是c语言
本文介绍了C语言为何成为系统开发的首选语言,从其诞生背景、发展历史及特点进行阐述。C语言源于贝尔实验室,与Unix操作系统相互促进,因其简洁、高效、跨平台等特性,逐渐成为主流。文章还提及了C语言的学习资料及其对编程文化的影响。
119 5
|
算法 C++
2022年第十三届蓝桥杯大赛C/C++语言B组省赛题解
2022年第十三届蓝桥杯大赛C/C++语言B组省赛题解
314 5
|
C语言 C++
C 语言的关键字 static 和 C++ 的关键字 static 有什么区别
在C语言中,`static`关键字主要用于变量声明,使得该变量的作用域被限制在其被声明的函数内部,且在整个程序运行期间保留其值。而在C++中,除了继承了C的特性外,`static`还可以用于类成员,使该成员被所有类实例共享,同时在类外进行初始化。这使得C++中的`static`具有更广泛的应用场景,不仅限于控制变量的作用域和生存期。
313 10