extern"C"的使用

通常,在C语言的头文件中经常可以看到类似下面这种形式的代码

640?wx_fmt=png

那么,这种写法什么用呢?实际上,这是为了让CPP能够与C接口而采用的一种语法形式。之所以采用这种方式,是因为两种语言之间的一些差异所导致的。由于CPP支持多态性,也就是具有相同函数名的函数可以完成不同的功能,CPP通常是通过参数区分具体调用的是哪一个函数。在编译的时候,CPP编译器会将参数类型和函数名连接在一起,于是在程序编译成为目标文件以后,CPP编译器可以直接根据目标文件中的符号名将多个目标文件连接成一个目标文件或者可执行文件。但是在C语言中,由于完全没有多态性的概念,C编译器在编译时除了会在函数名前面添加一个下划线之外,什么也不会做(至少很多编译器都是这样干的)。由于这种的原因,当采用CPP与C混合编程的时候,就可能会出问题。

 

要明白为何使用extern"C",还得从cpp中对函数的重载处理开始说起。在c++中,为了支持重载机制,在编译生成的汇编码中,要对函数的名字进行一些处理,加入比如函数的返回类型等等.而在C中,只是简单的函数名字而已,不会加入其他的信息.也就是说:C++和C对产生的函数名字的处理是不一样的.

 

比如下面的一段简单的函数,我们看看加入和不加入extern"C"产生的汇编代码都有哪些变化:

函数代码:

640?wx_fmt=png

在没有使用extern “C”时,生成的汇编代码为:

640?wx_fmt=png

当加入extern “C”参数时,产生的汇编代码为:

640?wx_fmt=png

两段汇编代码同样都是使用gcc-S命令产生的,所有的地方都是一样的,唯独是产生的

函数名,一个是f,一个是__Z1fv。


明白了加入与不加入extern"C"之后对函数名称产生的影响,我们继续我们的讨论:为什

么需要使用extern"C"呢?C++之父在设计C++之时,考虑到当时已经存在了大量的C代码,

为了支持原来的C代码和已经写好C库,需要在C++中尽可能的支持C,而extern"C"就是

其中的一个策略。


试想这样的情况:一个库文件已经用C写好了而且运行得很良好,这个时候我们需要使用这个库文件,但是我们需要使用C++来写这个新的代码。如果这个代码使用的是C++的方式链接这个C库文件的话,那么就会出现链接错误.


我们来看一段代码:首先,我们使用C的处理方式来写一个函数,也就是说假设这个函数当时是用C写成的:

640?wx_fmt=png

编译命令是:gcc-cf1.c-of1.o 产生了一个叫f1.o的库文件。再写一段代码调用这个f1

640?wx_fmt=png

链接两个生成的.o文件生成可执行文件,这时,产生错误:

640?wx_fmt=png

如果要改正链接错误,我们需要这样子改写

640?wx_fmt=png

这样就可以正常链接了。


C和C++对函数的处理方式是不同的.extern"C"是使C++能够调用C写作的库文件的一个手段,如果要对编译器提示使用C的方式来处理函数的话,那么就要使用extern"C"来说明。

640?wx_fmt=jpeg


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值