想要了解该问题的原因,我们就要先了解一下C语言和C++编译链接的过程。
编译链接过程:
总共有四步:预处理、编译、汇编、链接
①预处理:进行头文件展开、宏替换、去注释、条件编译等过程,将我们写的 .h文件、.cpp文件生成 .i文件。
②编译:检查语法,生成汇编代码,生成 .s文件。
③汇编:把汇编代码转变为二进制机器码,生成 .o文件。
④链接:把汇编代码转变为二进制机器码,将生成的 .o文件链接在一起生成可执行文件。
为什么C不支持重载,C++支持?
这是因为C和C++的命名规则存在不同,C语言在编译时,对函数的命名是完全根据函数名来确定的,函数重载又是函数名都相同的函数,因此对C语言来说,它无法通过函数名来区分不同的重载函数。在汇编阶段生成的 .o文件中,存在符号表,符号表中就有各个函数的函数名,重载函数在符号表里就会产生同名冲突。其次在链接时,因为是直接使用函数名来进行标识和查找,因此也存在歧义和冲突。
对于C++的命名规则就是对C语言的改进,C++在编译时对函数的命名不仅仅是根据函数名,同时也根据参数类型来命名,而重载的函数都是函数名相同但是参数的类型或者数量不同,因此C++就可以区分。