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

news/2024/6/29 11:51:15 标签: c, c++, 编译器, file, 语言, class
class="tags" href="/tags/C.html" title=c>cle class="tags" href="/tags/C.html" title=c>class="baidu_pl">
class="tags" href="/tags/C.html" title=c>cle_class="tags" href="/tags/C.html" title=c>content" class="tags" href="/tags/C.html" title=c>class="articlass="tags" href="/tags/C.html" title=c>cle_class="tags" href="/tags/C.html" title=c>content class="tags" href="/tags/C.html" title=c>clearfix">
class="tags" href="/tags/C.html" title=c>content_views" class="tags" href="/tags/C.html" title=c>class="htmledit_views">
http://blog.class="tags" href="/tags/C.html" title=c>csdn.net/gobitan/articlass="tags" href="/tags/C.html" title=c>cle/details/1532769

    在实际工作中可能经常要进行C和C++的混合编程࿰class="tags" href="/tags/C.html" title=c>c;C++调用Cclass="tags" href="/tags/YuYan.html" title=语言>语言的代码通常都比较容易࿰class="tags" href="/tags/C.html" title=c>c;但也有一些细节需要注意。C要调用C++的代码就略为麻烦一些࿰class="tags" href="/tags/C.html" title=c>c;因为C不支持面向对象的特征。
首先我们来看一下C++调用Cclass="tags" href="/tags/YuYan.html" title=语言>语言的代码。要让你的C代码既能被C代码又能被C++调用虽说容易࿰class="tags" href="/tags/C.html" title=c>c;但是还是有需要注意的地方。现有三个文件分别如下:
<class="tags" href="/tags/C.html" title=c>code class="tags" href="/tags/C.html" title=c>class="language-class="tags" href="/tags/C.html" title=c>cpp">/* class="tags" href="/tags/FILE.html" title=file>file TestC.h */
#ifndef TESTC_H
#define TESTC_H
 
#ifdef __class="tags" href="/tags/C.html" title=c>cplusplus
extern "C" {
#endif
 
int add(int a, int b);
      
#ifdef __class="tags" href="/tags/C.html" title=c>cplusplus
}
#endif
 
#endif /* TESTC_H */class="tags" href="/tags/C.html" title=c>code>

<class="tags" href="/tags/C.html" title=c>code class="tags" href="/tags/C.html" title=c>class="language-class="tags" href="/tags/C.html" title=c>cpp">/* class="tags" href="/tags/FILE.html" title=file>file TestC.class="tags" href="/tags/C.html" title=c>c */
 
#inclass="tags" href="/tags/C.html" title=c>clude "TestC.h"
 
int add(int a, int b)
{
    return (a + b);
}
class="tags" href="/tags/C.html" title=c>code>

<class="tags" href="/tags/C.html" title=c>code class="tags" href="/tags/C.html" title=c>class="language-class="tags" href="/tags/C.html" title=c>cpp">/* class="tags" href="/tags/FILE.html" title=file>file TestCpp.class="tags" href="/tags/C.html" title=c>cpp */
#inclass="tags" href="/tags/C.html" title=c>clude "stdio.h"
#inclass="tags" href="/tags/C.html" title=c>clude "TestC.h"
 
int main()
{
       printf("add = %d/n", add(2, 5));
      
       return 0;
}
class="tags" href="/tags/C.html" title=c>code>
说明:

class="tags" href="/tags/FILE.html" title=file>file TestC.h是C的头文件࿰class="tags" href="/tags/C.html" title=c>c;class="tags" href="/tags/FILE.html" title=file>file TestC.class="tags" href="/tags/C.html" title=c>c是其实现文件࿰class="tags" href="/tags/C.html" title=c>c;class="tags" href="/tags/FILE.html" title=file>file TestCpp.class="tags" href="/tags/C.html" title=c>cpp是调用C函数的C++文件。
文件TestC.h中的TESTC_H定义是为了头文件保护࿰class="tags" href="/tags/C.html" title=c>c;” #ifdef __class="tags" href="/tags/C.html" title=c>cplusplus”这个不能缺少࿰class="tags" href="/tags/C.html" title=c>c;你可以去查看C的标准库头文件中都有这个࿰class="tags" href="/tags/C.html" title=c>c;如”stdio.h”。有了这个宏class="tags" href="/tags/BianYiQi.html" title=编译器>编译器就知道现在是C还是C++在调用它。
为什么要区分C与C++调用呢?其深层次原因是因为C和C++class="tags" href="/tags/BianYiQi.html" title=编译器>编译器在编译和链接时对于函数的处理不一样。C++为了支持函数重载在编译时会加入函数参数及类型信息。如上面的add方法࿰class="tags" href="/tags/C.html" title=c>c;Cclass="tags" href="/tags/BianYiQi.html" title=编译器>编译器编译后在符号库中的名字为_add࿰class="tags" href="/tags/C.html" title=c>c;而C++class="tags" href="/tags/BianYiQi.html" title=编译器>编译器则会产生像_add_int_int之类的名字。C++正是依靠这种机制实现了函数的重载。
extern关键字表示将函数或变量声明为全局类型࿰class="tags" href="/tags/C.html" title=c>c;与之相对应的是staticlass="tags" href="/tags/C.html" title=c>c。staticlass="tags" href="/tags/C.html" title=c>c限定函数或变量的作用域为本文件。extern还有一个作用就是与”C”连在一起使用࿰class="tags" href="/tags/C.html" title=c>c;即extern “C”通知class="tags" href="/tags/BianYiQi.html" title=编译器>编译器将extern “C”所包含的代码按照C的方式编译和链接。
 
下面我们就来看看如何在Cclass="tags" href="/tags/YuYan.html" title=语言>语言中使用C++的代码(包括C++类的方法)。为了简单起见࿰class="tags" href="/tags/C.html" title=c>c;我将类的定义和实现放在一个文件中(通常应该是将分别放在.h和.class="tags" href="/tags/C.html" title=c>cpp文件中)。自定义类文件(这里省略了头文件保护等其它细节)如下:
<class="tags" href="/tags/C.html" title=c>code class="tags" href="/tags/C.html" title=c>class="language-class="tags" href="/tags/C.html" title=c>cpp">/* class="tags" href="/tags/FILE.html" title=file>file TestClass.h */
 
class="tags" href="/tags/C.html" title=c>class HJH
{
publiclass="tags" href="/tags/C.html" title=c>c:
    int add(int a, int b)
       {
              return (a + b);
       }
};
class="tags" href="/tags/C.html" title=c>code>

将C++类封装为C函数的文件(为了简略也将声明和实现放在了同一个文件中)如下:

<class="tags" href="/tags/C.html" title=c>code class="tags" href="/tags/C.html" title=c>class="language-class="tags" href="/tags/C.html" title=c>cpp">/* class="tags" href="/tags/FILE.html" title=file>file TestCpp.class="tags" href="/tags/C.html" title=c>cpp */
 
#inclass="tags" href="/tags/C.html" title=c>clude "TestClass.h"
 
extern "C" int add_class="tags" href="/tags/C.html" title=c>cpp(int a, int b);
 
int add_class="tags" href="/tags/C.html" title=c>cpp(int a, int b)
{
       HJH hjh;
 
       return hjh.add(a, b);      
}
class="tags" href="/tags/C.html" title=c>code>
实际调用C++代码的C文件如下:

<class="tags" href="/tags/C.html" title=c>code class="tags" href="/tags/C.html" title=c>class="language-class="tags" href="/tags/C.html" title=c>cpp">/*class="tags" href="/tags/FILE.html" title=file>file TestC.class="tags" href="/tags/C.html" title=c>c */
#inclass="tags" href="/tags/C.html" title=c>clude "stdio.h"
 
extern int add_class="tags" href="/tags/C.html" title=c>cpp(int a, int b);
 
int main()
{
       printf("add_class="tags" href="/tags/C.html" title=c>cpp = %d/n", add_class="tags" href="/tags/C.html" title=c>cpp(2, 5));
      
       return 0;
}
class="tags" href="/tags/C.html" title=c>code>
上面的过程很清晰࿰class="tags" href="/tags/C.html" title=c>c;就是用一个函数将C++类的使用封装起来࿰class="tags" href="/tags/C.html" title=c>c;然后将它外部声明为C函数就可以了。

文件TestClass.h定义并实现了一个类࿰class="tags" href="/tags/C.html" title=c>c;该类只有一个add方法。文件TestCpp.class="tags" href="/tags/C.html" title=c>cpp定义并实现了一个函数add_class="tags" href="/tags/C.html" title=c>cpp࿰class="tags" href="/tags/C.html" title=c>c;函数中定义了一个HJH类对象并调用了该对象的add方法。然后将add_class="tags" href="/tags/C.html" title=c>cpp函数进行外部声明为C。
TestC.class="tags" href="/tags/C.html" title=c>c文件中为了使用add_class="tags" href="/tags/C.html" title=c>cpp函数࿰class="tags" href="/tags/C.html" title=c>c;也需要进行外部声明。这是为了通知class="tags" href="/tags/BianYiQi.html" title=编译器>编译器说明这个函数是在其他文件中实现(注意在C文件中的extern后面不可加”C”)。当这三个文件一起编译链接时࿰class="tags" href="/tags/C.html" title=c>c;class="tags" href="/tags/BianYiQi.html" title=编译器>编译器就可以找到add_class="tags" href="/tags/C.html" title=c>cpp的具体实现。
以上代码均在Visual C++6.0环境下编译通过并运行。如果有疑问请留言或E-mail: hjhinternet@163.class="tags" href="/tags/C.html" title=c>com。

class="tags" href="/tags/C.html" title=c>cle>

http://www.niftyadmin.cn/n/1604742.html

相关文章

又一个新基建标杆案例来了!百度与上海浦东新区签署战略合作协议

新基建浪潮下&#xff0c;人工智能等前沿技术正在成为提升产业发展和城市治理能力的新抓手。7月11日&#xff0c;2020世界人工智能大会云端峰会签约与发布活动上&#xff0c;上海市浦东新区人民政府与百度签署战略合作框架协议。双方将发挥各自优势&#xff0c;共同探索人工智能…

入局刷脸支付创业能赚到第一波红利

门槛进一步降低刷脸支付未来或呈爆发式增长。从当前披露的数据来看&#xff0c;刷脸和指纹完成的支付占比高达六成&#xff0c;已经成为一种主流方式。财政科学研究院应用经济学博士后盘和林介绍&#xff0c;因为刷脸支付比密码支付等方式更便捷&#xff0c;随着技术门槛的进一…

中国建材集团与百度智能云达成重磅合作,联手打造智能制造新范本

人工智能与工业制造的融合正进一步加深。7月13日&#xff0c;百度与中国建材集团签署战略合作协议&#xff0c;将在智慧物流、数字矿山、智慧工厂、工业无人驾驶、数据中心新基建、企业 AI 大脑等多个领域开展深入合作。合作第一期已签署合同金额2700万元。整个战略合作价值将超…

1D.7 张兆庆教授编译组为英特尔开发出开放源码编译器

http://www.cas.cn/jzd/jcx/jcxwh/200209/t20020905_1034512.shtml □撰稿人&#xff1a;刘振坤(科学时报社) 中科院计算所编译组自60年代起&#xff0c;承担了院、国家科研攻关项目&#xff0c;自主开发了若干国产大型机的语言编译系统。90 年后开发了共享内存、分布式内…

刷脸支付市场反应火爆千万不要错过时机

刷脸支付收银系统的应用让消费者自助购物&#xff0c;正规购物过程更加便捷了&#xff0c;同时对于商户来说&#xff0c;还可以通过收银系统的会员管理、会员管理营销、会员加广告以及服务&#xff0c;为商户提供了收银、店铺管理、营销加广告等一站式便捷的闭环应用。 对于餐…

刷脸支付打开各行业新的智慧收银大门

此次微信和支付宝面向市场推出的刷脸支付的产品&#xff0c;在安全上做了极大的努力&#xff0c;通过数据层层加密&#xff0c;保障了商户的资金安全&#xff0c;同时也为消费者带来了全新的消费体验&#xff0c;减少了商户在高峰期人流量分流的问题&#xff0c;与传统的聚合二…

5G必然为刷脸支付提供更多的应用可能

5G的发展前景不止于此&#xff0c;它的合作技术非常多&#xff0c;比如AI和大数据等&#xff0c;刷脸技术落地以后&#xff0c;迎合5G浪潮&#xff0c;将会提供更精准、更完善、更丰富化的服务&#xff0c;它的全面应用将会为企业行业带去智能化体验&#xff0c;也会引发新一轮…

1D.9 计算所在系统结构基础研究领域取得新突破

http://www.cas.cn/ky/kyjz/201003/t20100316_2798103.shtml近日&#xff0c;中国科学院计算技术研究所系统结构基础研究方向喜讯频传&#xff0c;在最高水平的国际学术会议——计算机体系结构国际会议&#xff08;ISCA&#xff09;和语言设计与实现&#xff08;PLDI&#xff0…