C++支持函数的重载,对重载函数版本的选择,在链接的时候如何处理,C++的做法是为每个重载版本根据其参数类型扩展其原始函数名称,这样根据重载类型即可决定实际调用哪一个具体的重载版本

鉴于历史遗留原因,以及C++的设计原则,保持和C库链接的兼容性,需要C++能链接C库函数;可是C语言对函数名称的扩展与C++有不同的处理方式,比如在函数原始名称前简单的加上'_',或者根本没有变化,当C++重载一个C库函数的时候,如何处理这两种不同策略,并正确链接到C库中的函数(如果不做特殊处理,直接按照C++的方式对函数名进行编码,势必不能链接到正确的C函数),而且能与现有的链接程序一起工作

C++的做法是,当需要调用C库中的函数funca时,需要做如下的连接描述扩充:

 
  
  1. extern "C"{  
  2.          return_type funca(param...);  

这个声明告诉编译程序,对函数funca,应该使用C的命名习惯,否则将会按照C++的规则对函数名进行编码(至于对C++函数名如何编码各有实现),通过这种特殊对待的处理方式,就能在C++中链接到正确的C库函数了

 

那反其道而行,如何在C代码里面使用C++编译而成的动态链接库中的函数呢

首先C不支持类,所以不能直接调用类成员函数,其次C++的函数名称有其自己的编码规则,如上所述,C调用不能正确的链接到目标函数

针对第一个问题,需要再为C写一个接口函数(C风格),这个函数使用C++库中的类完成目标功能,C程序直接和这个接口函数打交道

为了解决第二个问题,需要将这个接口函数按照上面的方式添加链接描述扩充也就是extern那一段儿

最后,如果这个C程序是使用的.c传统后缀,我们需要显示的使用g++来编译该程序并链接动态库,因为gcc模式是以普通模式处理.c文件,而调用g++处理.cpp文件;

 

最后提一句 gcc  g++本质是一个程序