中易网

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

答案:2  悬赏:70  
解决时间 2021-12-30 13:32
如何有效解决C与C++的相互调用问题
最佳答案
在实际工作中可能经常要进行C和C++的混合编程,C++调用C语言的代码通常都比较容易,但也有一些细节需要注意。C要调用C++的代码就略为麻烦一些,因为C不支持面向对象的特征。首先我们来看一下C++调用C语言的代码。要让你的C代码既能被C代码又能被C++调用虽说容易,但是还是有需要注意的地方。现有三个文件分别如下:#ifndef TESTC_H#define TESTC_H #ifdef __cplusplusextern "C" {#endif int add(int a, int b); #ifdef __cplusplus}#endif #endif #include "TestC.h" int add(int a, int b){ return (a + b);} #include "stdio.h"#include "TestC.h" 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++类的方法)。为了简单起见,我将类的定义和实现放在一个文件中(通常应该是将分别放在.h和.cpp文件中)。自定义类文件(这里省略了头文件保护等其它细节)如下:/ class HJH{public: int add(int a, int b) { return (a + b); }}; 将C++类封装为C函数的文件(为了简略也将声明和实现放在了同一个文件中)如下: #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文件如下:#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的具体实现。以上代码均在Visual C++6.0环境下编译通过并运行。
全部回答
在实际工作中可能经常要进行c和c++的混合编程,c++调用c语言的代码通常都比较容易,但也有一些细节需要注意。c要调用c++的代码就略为麻烦一些, 因为c不支持面向对象的特征。 1,首先我们来看一下c++调用c语言的代码。要让你的c代码既能被c代码又能被c++调用虽说容易,但是还是有需要注意的地方。现有三个文件分别如下:[cpp]#ifndef testc_h#definetestc_h#ifdef__cplusplus //2个下划线extern"c"{#endifintadd(inta, intb);#ifdef__cplusplus}#endif#endif[cpp]#include "testc.h"intadd(inta, intb){return(a+b);}[cpp]#include#include"testc.h"intmain(){printf("add=%d\n" ,add(2,5));return0;}说明: file testc.h是c的头文件,file testc.c是其实现文件,file testcpp.cpp是调用c函数的c++文件。 文件testc.h中的testc_h定义是为了头文件保护,”#ifdef__cplusplus ”这个不能缺少,你可以去查看c的标准库头文件中都有这个,如”stdio.h”。 有了这个宏编译器就知道现在是c还是c++在调用它。 c编译器编译后在符号库中的名字为_add,而c++编译器则会产生像_add_int_int之类的名字。c++正是依靠这种机制实现了函数的重载。 extern关键字表示将函数或变量声明为全局类型,与之相对应的是static。static限定函数或变量的作用域为本文件。extern还有一个作用就是与”c”连在一起使用,即extern“c”通知编译器将extern “c”所包含的代码按照c的方式编译和链接。 intb){return(a+b);}}; 将c++类封装为c函数的文件(为了简略也将声明和实现放在了同一个文件中)如下:[cpp]#include"testclass.h"extern"c"intadd_cpp(inta, intb);intadd_cpp(inta, intb){adds;return s.add(a,b) ;} 实际调用c++代码的c文件如下:[cpp]#includeexternintadd_cpp(inta, intb);intmain(){printf("add_cpp=%d\n" ,add_cpp(2,5));return0;} 上面的过程很清晰, 就是用一个函数将c++类的使用封装起来,然后将它外部声明为c函数就可以了。 文件testclass.h定义并实现了一个类,该类只有一个add方法。文件testcpp.cpp定义并实现了一个函数add_cpp,函数中定义了一个hjh类对象并调用了该对象的add方法。然后将add_cpp函数进行外部声明为c。 testc.c文件中为了使用add_cpp函数,也需要进行外部声明。这是为了通知编译器说明这个函数是在其他文件中实现( 注意在c文件中的extern后面不可加”c” )。
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
关于胜利的词语
風恬浪靜的意思是什么?風恬浪靜的释义是什么
摛布的意思是什么啊?请解释下!
一个日本电影 女的和一个男的在喝酒,后来后
从火车站怎么去劳务市场《杭州》
私誉的意思是什么?私誉的释义是什么啊?
倚桡的意思是什么啊?请解释下!
国外墙上刻着关于爱情的谚语
广西南宁丢雷螺母 /丢雷漏斗什么意思
逻逼的意思是什么?逻逼的释义是什么啊?
怎么去联系家装店装 刚刚开始怎么去跑这样的
北大青鸟消防各个回路什么线可以并?电源线可
清规的意思是什么啊?请解释下!
请问xps15-228共有几个内存卡位?原配什么内存
敵愾同仇的意思是什么?敵愾同仇的释义是什么
推荐资讯
梦见关窗户是什么意思
騰頓的意思是什么?騰頓的释义是什么啊?
灾麦子是什么意思。
耳也的意思是什么啊?请解释下!
郁阴的意思是什么?郁阴的释义是什么啊?
云日的意思是什么啊?请解释下!
先幽默后正经的群介绍
生活費的意思是什么?生活費的释义是什么啊?
獮田的意思是什么?獮田的释义是什么啊?
半掀兒的意思是什么?半掀兒的释义是什么啊?
竹輿的意思是什么?竹輿的释义是什么啊?
为什么化妆后脸部皮肤会变黄??
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?