宣传型企业网站,工程建设信息网站资质公告,商丘网站建设专业现状,哈尔滨app网站开发#x1f3a5; 屿小夏 #xff1a; 个人主页 #x1f525;个人专栏 #xff1a; C入门到进阶 #x1f304; 莫道桑榆晚#xff0c;为霞尚满天#xff01; 文章目录 #x1f4d1;前言一、函数重载1.1 函数重载的概念1.2 函数重载的作用1.3 C支持函数重载的原理1.4 扩展 屿小夏 个人主页 个人专栏 C入门到进阶 莫道桑榆晚为霞尚满天 文章目录 前言一、函数重载1.1 函数重载的概念1.2 函数重载的作用1.3 C支持函数重载的原理1.4 扩展 ️ 全篇总结 前言 函数重载是C中非常重要的概念它允许在同一作用域中声明多个同名函数但这些函数的参数列表必须不同。通过函数重载可以提高代码的可读性和可维护性简化函数调用并提供更多的灵活性。本文将深入探讨函数重载的概念、作用以及C支持函数重载的原理帮助读者更好地理解和应用这一重要的编程特性。 一、函数重载
1.1 函数重载的概念
函数重载是函数的一种特殊情况
C允许在同一作用域中声明几个功能类似的同名函数这些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同常用来处理实现功能类似数据类型不同的问题。
#includeiostream
using namespace std;
// 1、参数类型不同
int Add(int left, int right)
{cout int Add(int left, int right) endl;return left right;
}
double Add(double left, double right)
{cout double Add(double left, double right) endl;return left right;
}
// 2、参数个数不同
void f()
{cout f() endl;
}
void f(int a)
{cout f(int a) endl;
}
// 3、参数类型顺序不同
void f(int a, char b)
{cout f(int a,char b) endl;
}
void f(char b, int a)
{cout f(char b, int a) endl;
}
int main()
{Add(10, 20);Add(10.1, 20.2);f();f(10);f(10, a);f(a, 10);return 0;
}1.2 函数重载的作用
提高代码的可读性和可维护性通过使用相同的函数名来表示一组相关的功能可以使代码更加清晰和易于理解。简化函数调用不同的参数列表可以根据不同的情况选择合适的函数进行调用避免了编写大量的条件判断语句。提供更多的灵活性通过函数重载可以根据需要提供多种不同的函数实现满足不同的需求。
1.3 C支持函数重载的原理
C支持函数重载但是C语言不支持函数重载这是为什么呢 在C/C中一个程序要运行起来需要经历以下几个阶段预处理、编译、汇编、链接 。 实际项目通常是由多个头文件和多个源文件构成当前a.cpp中调用了b.cpp中定义的Add函数时编译后链接前a.o的目标文件中没有Add的函数地址因为Add是在b.cpp中定义的所以Add的地址在b.o中。那么怎么办呢 链接阶段就是专门处理这种问题链接器看到a.o调用Add但是没有Add的地址就会到b.o的符号表中找Add的地址然后链接到一起。 链接时面对Add函数链接接器会使用哪个名字去找呢这里每个编译器都有自己的函数名修饰规则。
Windows下vs修饰规则过于复杂Linux下g修饰规则简单易懂下面使用g演示这个修饰后的名字。
C语言编译后函数名字的修饰没有发生改变。 C编译后函数名字的修饰发生改变编译器将函数参数类型信息添加到修改后的名字中。 以上我们可以看出gcc的函数修饰后名字不变。而g的函数修饰后变成【_Z函数长度函数名类型首字母】。
这里就理解了C语言没办法支持重载因为同名函数没办法区分。而C是通过函数修饰规则来区分只要参数不同修饰出来的名字就不一样就支持了重载。
如果两个函数函数名和参数是一样的返回值不同是不构成重载的因为调用时编译器没办法区分。
1.4 扩展 windows下vs编译器对函数名字修饰规则相对复杂难懂但道理都是类似的这里就不做细致的研究了。
关于对C/C函数调用约定和名字修饰规则C/C的调用约定 里面有对vs下函数名修饰规则讲解。
有兴趣好奇的小伙伴可以看看哦~
️ 全篇总结
函数重载是C编程中的重要概念掌握了函数重载可以使代码更加清晰易懂提高代码的灵活性和可维护性。