什么是函数重载
C++允许在同一个作用域中声明几个功能类似的同名函数,这些同名函数的形式参数的个数,顺序,类型不同,常常用于实现功能类似,但是数据类型不同的函数。
1 | cpp复制代码int funtion(int a, int b, int c) |
但是下面的却不构成函数重载
1 | cpp复制代码nt funtion(int a, int b, int c) |
它们的返回值类型不同
为什么C语言不支持函数重载
这是因为,在C语言中,编译器在编译.c文件时,只会给函数进行简单的重命名;具体的方法是给函数名之前加上”_”;所以加入两个函数名相同的函数在编译之后的函数名也照样相同;调用者会因为不知道到底调用那个而出错;
而在CPP中虽然函数名字是一样的,但是符号表却是不一样的,符号表的命名规则是返回类型+函数名+参数列表
我们来验证一下
1 | c复制代码#include<iostream> |
在这段代码中先用g++编译,再执行我们执行命令objdump -d a.out >log.txt反汇编并将结果重定向到log.txt文件中,然后分析log.txt文件。
发现函数void print(int i) 编译之后为:(注意它的函数签名变为—— _Z5printi)
发现函数void print(string str) 编译之后为:(注意它的函数签名变为—— _Z5printSs)
函数的名字变了,所以不存在命名冲突了,而且名字起名是有依据的——_+返回值+函数名+函数参数
如何在c++文件中实验C语言
非常简单 我们在C语言函数前面加上extern”C”就可以了extern "C" void add(int a, int b) { printf("%d\n", a + b); }
本文转载自: 掘金