from:https://blog.csdn.net/gobitan/article/details/1532769

在实际工作中可能经常要进行C和C++的混合编程,C++调用C语言的代码通常都比较容易,但也有一些细节需要注意。C要调用C++的代码就略为麻烦一些,因为C不支持面向对象的特征。

一、C++调用C

首先我们来看一下C++调用C语言的代码。要让你的C代码既能被C代码又能被C++调用虽说容易,但是还是有需要注意的地方。现有三个文件分别如下:
/* file TestC.h */
#ifndef TESTC_H
#define TESTC_H
#ifdef __cplusplus
extern "C" 
{
#endif
int add(int a, int b);
#ifdef __cplusplus
}
#endif
#endif /* TESTC_H */
/* file TestC.c */
#include "TestC.h"
int add(int a, int b)
{
return (a + b);
}
/* file TestCpp.cpp */
#include "stdio.h"
#include "TestC.h" //TestC.h是C的头文件
int main()
{
printf("add = %d/n", add(2, 5));
return 0;
}
说明:
file TestC.h是C的头文件,file TestC.c是其实现文件,file TestCpp.cpp是调用C函数的C++文件。
文件TestC.h中的TESTC_H定义是为了头文件保护,” #ifdef __cplusplus”这个不能缺少,你可以去查看C的标准库头文件中都有这个,如”stdio.h”。有了这个宏编译器就知道现在是C还是C++在调用它。
为什么要区分C与C++调用呢?其深层次原因是因为C和C++编译器在编译和链接时对于函数的处理不一样。C++为了支持函数重载在编译时会加入函数参数及类型信息。如上面的add方法,C编译器编译后在符号库中的名字为_add,而C++编译器则会产生像_add_int_int之类的名字。C++正是依靠这种机制实现了函数的重载。
extern关键字表示将函数或变量声明为全局类型,与之相对应的是static。static限定函数或变量的作用域为本文件。extern还有一个作用就是与”C”连在一起使用,即extern “C”通知编译器将extern “C”所包含的代码按照C的方式编译和链接。

二、C调用C++

下面我们就来看看如何在C语言中使用C++的代码(包括C++类的方法)。为了简单起见,我将类的定义和实现放在一个文件中(通常应该是将分别放在.h和.cpp文件中)。自定义类文件(这里省略了头文件保护等其它细节)如下:
//* file TestClass.h */
class HJH
{
public:
int add(int a, int b)
{
return (a + b);
}
};
将C++类封装为C函数的文件(为了简略也将声明和实现放在了同一个文件中)如下:
/* file TestCpp.cpp */
#include "TestClass.h"
extern "C" int add_cpp(int a, int b);
int add_cpp(int a, int b)
{
HJH hjh;
return hjh.add(a, b);      
}
实际调用C++代码的C文件如下:
/*file TestC.c */
#include "stdio.h"
extern int add_cpp(int a, int b);
int main()
{
printf("add_cpp = %d/n", add_cpp(2, 5));
return 0;
}
上面的过程很清晰,就是用一个函数将C++类的使用封装起来,然后将它外部声明为C函数就可以了。
文件TestClass.h定义并实现了一个类,该类只有一个add方法。文件TestCpp.cpp定义并实现了一个函数add_cpp,函数中定义了一个HJH类对象并调用了该对象的add方法。然后将add_cpp函数进行外部声明为C。
TestC.c文件中为了使用add_cpp函数,也需要进行外部声明。这是为了通知编译器说明这个函数是在其他文件中实现(注意在C文件中的extern后面不可加”C”)。当这三个文件一起编译链接时,编译器就可以找到add_cpp的具体实现。

如何有效解决C与C++的相互调用问题相关推荐

  1. 如何解决Spring在同类方法相互调用中,事务,缓存等注解不生效的问题

    ☀️相信在日常开发中,一定经历过这样一个场景,就以下面这段代码抽象一下: @Service public class ServiceA {public void methodA() {methodB( ...

  2. 软件测试作业1 -- 关于c++项目中类相互调用的问题与解决

    在上学期c++的课程中,老师留了三个大项目和一些小作业,这些项目对于我来说都是很有意义的, 在完成作业的过程中不断的提升编程能力是一件令人高兴的事情,每一次的作业其实都有很多的小问题, 要么在编译出现 ...

  3. 文档类CDocument、子框架类CFrameWnd及视图类CView的关系及如何相互调用

    文档类.子框架类及视图类的关系及如何相互调用 收藏 了解文档和视图的相互作用关系是编写MFC程序的基本功.但是MFC的应用程序框架把文档和视图之间的关系封装了起来,初学的朋友往往不得要领,因此写程序往 ...

  4. Swift学习Day01(Object_c 与Swift的相互调用 )

    为什么80%的码农都做不了架构师?>>>    从今天开始: 学习一门新门的语言Swift,之前常用的语言  java .object-c:相信 学起swift来,也会很快的: 之前 ...

  5. 前台为html后台是asp在vs2012中建立什么,Asp.net中后台*.cs与前台JS脚本之间相互调用的几点心得...

    Asp.net中后台*.cs与前台JS脚本之间相互调用的几点心得 < type="text/javascript"> < type="text/java ...

  6. Android JNI学习(五)——Java与Native之间如何实现相互调用

    本章将讲述Java与Native之间如何实现相互调用.我将围绕围绕如下三点来讲解. #mermaid-svg-qeVnGlVrLWrB5ryX .label{font-family:'trebuche ...

  7. 随想录(ccpp之间的相互调用)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 作为系统工程师,平时用c可能多一些.这两天因为工作的原因,了解了linux上面cpp的编写方法. ...

  8. java 多个项目间事物_Java-web-多个独立项目之间相互调用实践

    本篇文章只涉及到应用层面,没有涉及到什么底层原理之类的,我目前的实力还没有达到那个级别.如果是大神级别的人看到这篇文章,请跳过. 项目框架也已经是搭建好了的,springboot版本为1.5,数据库操 ...

  9. VS下同一个solution下不同project之间头文件的相互调用

    https://blog.csdn.net/ljp1919/article/details/47804695 问题: 同一个solution下可以根据需求建立不同的project,那么怎么实现不同pr ...

最新文章

  1. GNU make 和 makefile
  2. safari快捷图标不见了_Win7桌面图标不见了怎么办?附解决办法
  3. angular 缓存 html5,Angular 如何及时更新客户端缓存?
  4. go语言 doc转换html,go语言使用wkhtmltopdf工具将html转成pdf
  5. hadoop中join操作
  6. android 携程日历控件,仿携程酒店日历组件for小程序
  7. 学者:比特币暴涨有合理性但仍应警惕其风险
  8. pytorch如何增加维度_Pytorch中的LSTM:如何添加/更改序列长度维度?-问答-阿里云开发者社区-阿里云...
  9. c# Invalidate() Update() Refresh()的区别
  10. 网络层传输协议(详解)
  11. 自同构 黎曼度量 莫比乌斯变换
  12. Web开发网页颜色搭配
  13. 男人就应该对自己狠一点
  14. arcgis api 动态显示鼠标位置经纬度
  15. 记疫情无聊时对老师答题网站的一次渗透(1)
  16. 【线性代数及其应用】05 - 正交性和最小二乘
  17. BPDU Gard / BPDU Filter / Root Guard
  18. 三极管静态工作点的估算
  19. Linux安装后连不上网络
  20. 开网店必看:2019年,《电商法》下五大电商趋势分析!

热门文章

  1. BUAA-OO 第二单元作业“电梯调度”总结与思考
  2. 学习ecshop 教程网址
  3. C# - 创建List属性的简单方法
  4. [LeetCode]Search Insert Position
  5. android学习日记12--布局管理器
  6. 进程间通信之管道通信
  7. Linux命令替换字符串
  8. web流程设计器 工作流的 整合视频教程 activiti画图 SSM和独立部署
  9. 枚举enum、NS_ENUM 、NS_OPTIONS
  10. xhost和XServer相关概念汇总