c函数重载的实现

函数重载是C++中特有的,在C语言中没有。

函数重载的定义:指在同一作用域内,可以有一组相同函数名,不同参数列表的函数,这组函数称为重载函数。

 int Add(int a, int b)  //?Add@@YAHHH@Z
{
return a + b;
}
double Add(double a, double b)   //?Add@@YANNN@Z
{
return a + b;
}
double Add(int a, double b)   //?Add@@YANHNH@Z
{
return a + b;
}

下面用一幅图来展示函数重载在反汇编代码下所表示的内容:



C++中函数重载的原则:函数名相同,参数列表不同,返回值不能作为重载依据。

C++提供了C 连接交换指定符号extern“C”来解决名字匹配问题。

C++语言支持函数重载,C 语言不支持函数重载。函数被C++编译后在库中的名字
与C 语言的不同。假设某个函数的原型为: void foo(int x, int y);
该函数被C 编译器编译后在库中的名字为_foo , 而C++ 编译器则会产生像
_foo_int_int 之类的名字。

 如果C++程序要调用已经被编译后的C函数,该怎么办?

 假设某个C函数的声明如下: void foo(int x, int y); 该函数被C编译器编译后在库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字用来支持函数重载和类型安全连接。由于编译后的名字不同,C++程序不能直接调用C函数。

C++提供了一个C连接交换指定符号extern“C”来解决这个问题。例如: extern “C” { void foo(int x, int y); … // 其它函数 } 或者写成 extern “C” { #include “myheader.h” … // 其它C头文件 } 这就告诉C++编译译器,函数foo是个C连接,应该到库中找名字_foo而不是找_foo_int_int。

C++编译器开发商已经对C标准库的头文件作了extern“C”处理,所以我们可以用#include 直接引用这些头文件.

c++把重载函数的名字和参数类型结合在汇编曾给每个函数实现了自己的汇编实现,这样每次去调用这个函数时,c++编译器就根据参数类型去调用相应的函数。

这也是我们有时候在c++调用一些外部的c库或者是引用一些c语言的头文件时,要用extern “C”,这个关键字可以让编译器改变编译器对于这些函数的处理,让编译器在寻找这些函数对应的目标代码时寻找c编译器遍以后对应得函数块,而不是c++的,否则就会出现找不到该函数的错误。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值