函数重载---CPP 什么是函数重载 为什么C语言不支持函数

什么是函数重载

C++允许在同一个作用域中声明几个功能类似的同名函数,这些同名函数的形式参数的个数,顺序,类型不同,常常用于实现功能类似,但是数据类型不同的函数。

1
2
3
4
5
6
7
8
9
10
11
12
cpp复制代码int funtion(int a, int b, int c)
{
return a + b + c;
}
int funtion(double a, double b, int c)
{
return a + b + c;
}
int funtion(int a)
{
return a;
}

但是下面的却不构成函数重载

1
2
3
4
5
6
7
8
cpp复制代码nt funtion(int a, int b, int c)
{
return a + b + c;
}
double function(double a, double b, double c)
{
return a + b + c;
}

它们的返回值类型不同

为什么C语言不支持函数重载

这是因为,在C语言中,编译器在编译.c文件时,只会给函数进行简单的重命名;具体的方法是给函数名之前加上”_”;所以加入两个函数名相同的函数在编译之后的函数名也照样相同;调用者会因为不知道到底调用那个而出错;
而在CPP中虽然函数名字是一样的,但是符号表却是不一样的,符号表的命名规则是返回类型+函数名+参数列表
我们来验证一下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
c复制代码#include<iostream>
using namespace std;

void print(int i)
{
cout<<"print a integer :"<<i<<endl;
}

void print(string str)
{
cout<<"print a string :"<<str<<endl;
}

int main()
{
print(12);
print("hello world!");
return 0;
}

在这段代码中先用g++编译,再执行我们执行命令objdump -d a.out >log.txt反汇编并将结果重定向到log.txt文件中,然后分析log.txt文件。

发现函数void print(int i) 编译之后为:(注意它的函数签名变为—— _Z5printi

image.png

发现函数void print(string str) 编译之后为:(注意它的函数签名变为—— _Z5printSs

image.png
函数的名字变了,所以不存在命名冲突了,而且名字起名是有依据的——_+返回值+函数名+函数参数

如何在c++文件中实验C语言

非常简单 我们在C语言函数前面加上extern”C”就可以了
extern "C" void add(int a, int b) { printf("%d\n", a + b); }

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%