个人理解C++代码中的extern “C“

之前看项目代码中,不太清楚extern "C"的作用,后来用一个例子来想就想通了。

首先,解释extern "C"本身的意思:

  • C对于函数的编译,一般是比较统一的命名方式,如函数func可能会被改名为_func
  • C++中存在函数重载,所以在编译成目标代码时会结合参数列表对函数进行重命名以区别被重载的函数
  • C++文件中使用extern "C"就是告诉编译器这部分代码在编译的改名阶段是按照C的规则进行函数名的变换(类似地,在C文件中使用extern "C++"来说明按照C++的规则在编译阶段进行函数重命名)

接着,我是用一个比较特别的例子来理解这个extern "C"用法:

  • 我假设要用别人用C写的一个闭源库,他给我提供了一个tool.htool.so,其中tool.h给出函数原型,tool.so是由函数定义生成的链接库文件。
  • 我要使用这个tool库,就需要按照tool.h里面的原型去使用相应函数,然后在编译链接的时候把tool.so链接过去,用于替换我使用的tool.h里面那些函数。
  • 如果我不使用extern "C",那么我编译出来的待链接文件中所使用的函数func()被编译器按照C++的函数重命名规则改名为_func_arg_(),那么在链接阶段,链接器需要在tool.so库文件中去找名为_func_arg_()函数的二进制代码,但是原来tool.so库是按照C语言的重命名规则进行编译的,因此函数func()在库文件中的名字是_func(),那么链接器就会提示出错。
  • 如果我制定使用extern "C",那么编译器就会按照C的命名规则对func()进行重命名得到_func(),于是链接器就会拿着_func()这个名字去库文件中找函数实现,显然就能找到_func()的实现。

根据上面这个例子就可以理解extern "C"的作用了。

如果我的理解有错,请及时联系我更正,谢谢大家。

你可能感兴趣的:(C++编程,c++)