C++函数重载以及extern "C"

来源:互联网 发布:含有数据回归 编辑:程序博客网 时间:2024/06/05 09:08
1)函数重载的定义
 在相同的作用域,定义同名的函数,但是它们的参数
 表必须有所区分,这个的函数构成重载关系。


 注:重载与函数的返回类型无关,于形参名字无关,只与

 参数的个数、类型、顺序有关。

        const修饰的常函数和普通成员函数之间构成重载

        不同名字空间中的函数也可以通过名字空间指令/名字空间声明的方式构成重载关系。

2)调用函数时,编译器将根据实参与形参的匹配程序,
   自动选择最优的重载版本。
   当前的编译器一般规则g++ V4.4.7:
   完全匹配>常量转换>升级转换>降级转换(标准转换)> 自定义转换  >  省略号匹配

注意:在以往的编程中尽量实现完全匹配,如果不能进行完全匹配,按上述进行选择。

补充:

    char* ==> const char*   常量转换/常量匹配

    char   ==> int            升级转换

    short  ==>char         标准转换

3)函数重载原理

(1)C++编译器是通过对函数进行换名,将参数列表信息体现在
   最新的底层函数名中,从而实现函数的重载;
(2)C程序可以通过C++编译器换名之后的新函数名调用C++模块
   中的函数;
(3)可以通过extern "C"来明确要求C++编译器不要对后面的函数进行换名处理,此时可以满足C程序直接调用C++模块中函数的要求,如果不希望换名的内容比较多,则使用
extern "C"后面的大括号将所有的内容包含起来即可
   当然extern "C"会导致函数无法重载;
(4)C++程序调用C模块的函数时,调用的函数名也是会被C++编译器进行换名处理的,因此为了保证调用的顺利,在C++程序中使用extern "C" 后面的大括号将所有被调用的
C模块函数声明包含起来即可;

重点:extern "C"的使用与理解:

1.编译器g++和gcc之间的区别

(1)一种扩展名为.c的文件,gcc会把他当成c程序来处理,而g++会把他当成c++程序处理;

(2)文件扩展名为.cpp,在编译阶段,其实gcc和g++都是相同的,都使用的是gcc来进行处理,但是当进入链接阶段的时候,gcc无法自动链接C++的函数库,要想链接C++函数库,必须手动操作,命令为gcc hello.cpp -lstdc++ -o hello。而g++则会自动链接C++的函数库,为了方便起见,对于.cpp的文件就直接使用g++来进行编译和连接,省去了使用gcc进行编译的阶段,从而使得有些人感觉对于.cpp文件的处理么有gcc什么事儿,其实不然,编译阶段g++还是使用了gcc进行编译。



        由于编译器的差异,g++编译器与gcc编译器编译出来的.c文件的函数名不一样,g++编译器会将.c中的函数名进行变换。如果使用了extern "C"在头文件中

修饰了函数声明,修饰的函数在g++编译器编译后函数名不改。

        extern "C"的主要作用就是为了能够正确实现C++代码调用其他C语言代码。加上extern "C"后,会指示编译器这部分代码按C语言的进行编译,而不是C++的。


                                              C程序main调用                                                        C++程序main调用

----------------------------------------------------------------------------------------------------------------------------------------

C模块中的函数                            直接调用                                                    利用extern“C”修饰调用的函数

C++模块中的函数           在C++模块中用extern“C”修饰函数声明                                    直接调用

详解:http://blog.csdn.net/jiqiren007/article/details/5933599

1 0
原创粉丝点击