C++支持函数的重载,对重载函数版本的选择,在链接的时候如何处理,C++的做法是为每个重载版本根据其参数类型扩展其原始函数名称,这样根据重载类型即可决定实际调用哪一个具体的重载版本
鉴于历史遗留原因,以及C++的设计原则,保持和C库链接的兼容性,需要C++能链接C库函数;可是C语言对函数名称的扩展与C++有不同的处理方式,比如在函数原始名称前简单的加上'_',或者根本没有变化,当C++重载一个C库函数的时候,如何处理这两种不同策略,并正确链接到C库中的函数(如果不做特殊处理,直接按照C++的方式对函数名进行编码,势必不能链接到正确的C函数),而且能与现有的链接程序一起工作
C++的做法是,当需要调用C库中的函数funca时,需要做如下的连接描述扩充:
- extern "C"{
- 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++本质是一个程序