问题: 为什么C不支持函数重载,而C++支持?
因为C和C++的函数在源文件生成可执行程序文件的“编译”阶段函数签名的方式不一样。
举个例子:
如在.c和.cpp文件里分别定义个一模一样的函数int minus(int a, int b){return a - b;},在执行“编译”阶段函数签名后.c文件的该函数名为minus,.cpp文件的该函数名为_Z3minusii,如果.c和.cpp文件再定义一个同名函数,如int minus(int a, double b){return a - b;},函数签名后.c文件的该函数名为:minus,.cpp文件的该函数名为_Z3minusid,这样.c文件编译时就会报error: conflicting types for‘minus’ int minus(int a, double b) & note: previous definition of ‘minus’ was here. 问题,因为两个函数签名都是minus,所以报“类型冲突,这里之前定义过”,而.cpp文件正常,因为_Z3minusii函数签名和_Z3minusid不一样。
C++的函数签名方式是将函数的参数类型和函数名通过一定的关联规则生成,从这里也可以看出为什么C++说的函数重载为函数名相同,参数类型或者个数不同,返回类型任意即构成重载条件。