C和C++混合编程时的问题

在C++工程中,我们经常需要调用C库的函数,由于C++对C是兼容的,这里的兼容有几个方面的意思,一是本身语法及编译时对C语言源码的兼容,我们可以在C++代码中直接加入C语言源码,一般都不会出什么问题,
二是二进制库的兼容,意思就是在C++代码中可以直接调用现有的C库函数,链接的过程中链接器可以正常把C++目标文件和现有C语言的库文件链接起来。

C++对C的兼容以及C++本身针对大型程序而设计出来的出色的(同时也是复杂的)架构能力和抽象能力给C++带来了众多的粉丝,让C++成为了主流的开发语言,
言归正转,我们在C++项目中使用现有的C库时需要注意的其中一个问题就是名字装饰(name mangling),什么意思呢?顾名思义,名字装饰就是将原本名为X的
标识符改了新的名字,对C++程序有了解的程序员都知道C++面向对象的一大特点就是函数重载,实现不同的功能代码使用同一个函数名字,举例来讲,函数void sayHello(const char *name)
和函数void sayHello(const char *name, int times)可以同时存在一个类定义中,但是C语言我们要实现这样的东西就只能使用不同的函数名了,代码一旦膨胀,经常会觉得名字不够用。回到名字装饰的
问题,既然一个可以有多个同名函数,那么编译器编译的时候怎么分辨这些函数呢?这就需要用到名字装饰这个东西了,名字装饰就是由编译器在生成目标代码的过程中,自动地去根据函数的不同形式
给重新给函数一个函数名,以此来分别重载函数的不同实现。
这样,问题就来了,既然在C++代码中可以直接引入C语言的头文件,那么C语言这些函数引入进来之后编译的话,本来的函数名会被C++编译器改的面目全非(也不是面目全非啦其实,还是有
一定规则的,我只是夸张一下),链接的时候就会出问题,因为这个时候链接器在库文件中已经找不到本来为sayHello的函数修改之后的xxx@xxsayHelloxxx这个名字了,所以就会链接失败,为了解决这个
问题,C++中引入的extern "C"这个东西,它用来指示引入的C语言的符号按照C语言本身的方式来编译,禁止名字装饰,这样链接的时候就不会出问题了

C和C++混合编程时还有许多问题需要主题,有时间再慢慢讲

笔试面试经常有问到,哈哈,顶一顶!