解读:为什么C语言没有重载? |
您所在的位置:网站首页 › 没有重载函数接受两个参数怎么办 › 解读:为什么C语言没有重载? |
在了解这部分之前,我们需要回顾一下编译链接部分的知识,具体可参考这篇博客:程序的编译与链接 接下来我带大家简单回顾一下与我们这部分相关的知识—— 首先,工程的每一个源文件都是单独编译的,而编译阶段会有一个步骤:形成符号表。 假如,test.c文件中有这样的内容: #include int main() { int ret = add(1,2); return 0; }add函数是定义在其他源文件中的,而add.h中包含了这个函数的声明,也就是:int add(int a, int b);由于我们包含了这个头文件,因此这个头文件中的内容就会在预编译阶段展开,于是这个程序就变成了这样: int add(int a, int b); int main() { int ret = add(1,2); return 0; }那么这个源文件形成的符号表就可能是这样的: 寻址的步骤是在链接阶段。 链接时,编译器将所有源文件的符号表进行合并,那么此时,test.c这个源文件中符号表的???就可以填补上了。 于是乎,函数重载对于C语言就可望不可即了。为什么呢? 我们设想一下,在add.c中有两个函数: int add(int a, int b) { return a + b; } double add(double a, double b) { return a + b; }那么在编译初步形成符号表的时候就会有一个问题:这里有两个重名的符号,但是对应了两个不同的地址,哪个地址是对的呢?这时候编译器就蒙了。 我们继续说。 既然函数的修饰规则变了,那么尽管它们是同名函数,但是由于参数的个数、类型、顺序不同,就导致它们形成的符号有所差异,所以在链接的时候链接器就能够很容易的锁定目标。 或许编译器可以根据接收返回值的变量类型判断调用的是哪一个函数 int main() { int a = func(); bool b = func(); return 0; }但是肯定也会有这种情况: int main() { func(); return 0; }此时编译器根本就不能判断应该调用哪个重载了。 你,明白了吗?? |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |