C++中调用C语言库文件

我们都知道C++语言兼容C语言,那么C++调用C语言库,为什么为什么需要 extern "C"的帮助?

答案就是C++语言为了支持重构(重构的特征:相同的范围、相同的名字、不同的参数),在编译时对函数的命名方式进行了改变,编译后的名字包括一些参数的信息,这样才能在调用函数的时候对号入座。

 

那么extern "C"的作用,就是“提示”(为什么说提示,而不是“命令”呢,下面会分析)编译器,下面的文件和函数,要用C语言的命名规则进行。

所以加入要在A.cpp中使用C语言的B.lib库文件中的在xx.h中定义的导出函数CFun(),需要这么做。

1.首先将这个库文件链接到我们的工程中。

2.声明

     extern "C"

     {

          #include "abc.h"

          extern void CFun();

     }

3.然后就可以使用 CFun();

 

   但是我发现,有时候不使用extern "C"的方式(而是直接#include ""....)也可以使用这类函数,原因我分析如下:

   1.那个库文件并不是纯正的C语言下环境下编译而成的(具体是环境是在.c文件中使用了C++中的关键字)。

   2.extern "C"只是一种“提示”,而不是强制性命令编译器,具体是要不要用C语言规则,让编译器自己去判断。

 

 

后记:

  今天和一个资深工程师讨论,得出如下解释。

  1.在C语言的库文件中,"abc.h"包含如下定义:

 #ifdef __cplusplus  //在C++编译环境下

extern "C"

{

#endif

也就是说,在"abc.c"中 #include "abc.h"进行编译的时候,#ifdef __cplusplus并不会生效,因为当前是C语言的编译环境。

而在外部"abc.cpp"中  #include "abc.h" #ifdef __cplusplus就会生效了,所以可以用C语言的方式进行编译。

不得不说,这是一个很好的技巧。这样,在外部使用这个C语言的库的时候,不管是C还是C++的编译环境,都可以直接

#include "abc.h" 然后调用里面的函数了。

 

看来是我的水平太低了,欣赏不了别人的代码,还差点误解了前辈。

 

 

  

 

转载于:https://www.cnblogs.com/jamesmile/archive/2010/10/19/1855469.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值