C和C++的混合编译--extern “C”的使用

参考地址:http://www.cnblogs.com/skynet/archive/2010/07/10/1774964.html


在实际编程中,有时会需要用到C\C++的混合编译,通过extern “C”即可实现混合编译,以下是个人参照网友的资料以及自己的实际操作的收获。

一:C++中调用C程序

图片中print函数通过extern “C”来指明按照C的编译方式来编译,编译完成运行结果如下:


、在C中调用C++程序,分三个文件进行

1、cppHeader.h文件


2、cppHeader.cpp文件



3.extern.c文件,调用C++程序


4、编译过程,编译过程需要注意是C++按照C的编译方式,所以最终生成的文件是使用g++来进行编译,Makefile如下:


5、最终运行程序extern,运行结果如下


三、C\C++的编译和链接

C++是一个面向对象语言(虽不是纯粹的面向对象语言),它支持函数的重载,重载这个特性给我们带来了很大的便利。

为了支持函数重载的这个特性,C++编译器实际上将void print(int i);编译为:_print_int

这样的函数名,来唯一标识每个函数。注:不同的编译器实现可能不一样,但是都是利用这种机制。所以当连接是调用print(3)时,它会去查找_print_int(3)这样的函数。正是因为这点,重载被认为不是多态,多态是运行时动态绑定(“一种接口多种实现”),如果硬要认为重载是多态,它顶多是编译时“多态”。

C++中的变量,编译也类似,如全局变量可能编译g_xx,类变量编译为c_xx等。连接是也是按照这种机制去查找相应的变量。

C语言中并没有重载和类这些特性,故并不像C++那样print(int i),会被编译为_print_int,而是直接编译为_print等。因此如果直接在C++中调用C的函数会失败,因为连接是调用C中的print(3)时,它会去找_print_int(3)。因此extern "C"的作用就体现出来了。


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值