为什么c语言不支持函数重载,而c++支持函数重载

c++

为什么c语言不支持函数重载,而c++支持函数重载

在C/C++中,一个程序要运行起来,需要经历以下几个阶段:预处理、编译、汇编、链接

预处理
编译
汇编
链接
test.cpp
test.i
test.s
test.0
test.exe

预处理:1. 头文件展开 2. 宏替换 3. 去掉注释 4. 条件编译

编译: 1. 检查语法 2. 生成汇编代码(这个汇编是生成的mov,epb,esp这类的东西)

汇编:1. 生成二进制的指令(0,1组成的)

链接: 1.将多个源文件链接起来 生成可执行程序

了解一下上面的过程,

为什么c语言不支持函数重载,而c++支持呢?

因为在编译的时候,c语言和c++会给你写的程序内的函数的名字做一些修饰,以便于后续的调用。

但是,c语言和c++对函数名字的修饰规则是不一样的。(我们把修饰规则叫函数名修饰规则)

函数名修饰规则

函数也是有地址的,函数的地址默认的是第一句指令的地址,所以,函数如果只有声明是没法生成地址的,因为你只声明了这个函数,编译器就只知道在程序中有这个函数,但不知道这个函数的功能是什么,所以无法生成指令。

只有当你定义了这个函数之后,编译器才知道这个函数是干嘛的,才会生成指令,有了指令,默认的第一条指令就是函数的地址。

为什么要说一下函数的地址呢?

因为编译器通过函数名修饰规则后,去调用函数时是通过寻找函数的地址去实现调用函数的

比如你写一个fun 函数,

//以下是函数重载,(函数的名字一样,但是参数的顺序不一样,构成函数重载)
double fun1(int a, double b) //第一个
{
    return a * b;
}

double fun1(double a, int b) //第二个
{
    return a * b;
}

在c语言中fun1 会被修饰为_fun1

所以当你调用fun的时候,编译器不知道你调用的是第一个函数还是第二个函数。所以会报错

在c++中,第一个 fun1 会被修饰为fun1_id i 是int 的缩写,d 是double的缩写。

​ 第二个fun1 会被修饰为fun1_di

c++的修饰方法就将参数的顺序修饰到了函数名中

这样一来

当你调用第一个fun1 时 ,编译器会找到fun1_id 并进行调用

当你调用第二个fun1 时 ,编译器会找到fun1_di 并进行调用

这样就不会冲突。

即:c++支持函数重载,而c不支持

你可能感兴趣的:(c语言,c++)