【C++小知识】为什么C语言不支持函数重载,而C++支持

为什么C语言不支持函数重载,而C++支持

在了解C++函数重载前,如果对文件的编译与链接不太了解。可以看看我之前的一篇文章,链接: 文件的编译链接

想要清楚为什么C语言不支持函数重载而C++支持,有俩个过程:1.编译链接。2.函数名修饰过程。

编译链接过程

C++编译器与C编译器基本相似,当一个程序运行起来需要经历四个阶段:预处理、编译、汇编、链接。
在这里插入图片描述

假设文件中有一个头文件project.h、俩个源文件project.cpp和test.cpp

  • 在预处理阶段进行:头文件展开、宏定义、条件编译、去掉注释……
    project.h文件与project.cpp文件生成project.i文件
    project.h文件与test.cpp文件生成test.i文件

  • 在编译阶段:检查语法、生成汇编代码
    project.i文件转换为project.s文件
    test.i文件转换为test.s文件

  • 在汇编阶段:汇编代码转换为二进制的机器代码
    project.s文件转换为project.o文件
    test.s文件转换为test.o文件

  • 在链接阶段:生成可执行程序
    在windows环境下project.s与test.s文件会生成一个xxx.exe可执行程序。
    在Linux环境下project.s与test.s文件默认会生成一个a.out可执行程序。

在这里插入图片描述

函数名修饰过程

在了解完函数的编译链接后,当test.cpp文件中调用了project.cpp文件的函数,在编译后链接前是没有拿到函数地址的,这是因为test.cpp文件只包含了test.h文件,在预处理阶段头文件展开只有函数声明,不存在函数定义的地址,函数地址在project.o文件中。

【说明】声明类似于只是一种承诺,还未实现

而在链接阶段是专门为了处理此类型问题,链接器在发现test.o文件中只有函数声明,没有函数定义,就会去另一个.o文件中去寻找,然后链接在一起。

【说明】链接的作用是找到定义(类似于兑现承诺)

在链接时,面对一个函数,不同的编译器会有不同的函数名修饰规则。

  • 在Linux环境下,C语言编译器编译后结果

在这里插入图片描述
结论:在linux环境下,采用gcc编译完成后,函数名字的修饰没有发生改变。

  • 在Linux环境下,C++编译器编译后结果

在这里插入图片描述

结论:在linux环境下,采用g++编译完成后,函数名字的修饰发生改变,编译器将函数参
数类型信息添加到修改后的名字中。

可以发现gcc的函数修饰后名字不变,g++的函数修饰后变成【_Z+函数长度+函数名+类型首字母】

在Windows环境下,命名就比较复杂:
在这里插入图片描述

总结

C语言之间使用名称寻找地址,而C++使用函数名称加类型名称的缩写或者别称寻找地址。

所有C语言是不支持重载的,因为同名函数是无法进行区分的,而C++是通过函数修饰规则来区分,只要参数不同,修饰出来的名字就不同,即C++是支持重载的。

【注意】如果俩个函数名与类型完全相同,返回值不同是不构成重载的,因为编译时,编译器没有办法区分

相关推荐

  1. C++可以函数重载C可以的原因

    2024-06-05 19:54:03       57 阅读
  2. 为什么Rust语言支持三元表达式?

    2024-06-05 19:54:03       37 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-05 19:54:03       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-05 19:54:03       106 阅读
  3. 在Django里面运行非项目文件

    2024-06-05 19:54:03       87 阅读
  4. Python语言-面向对象

    2024-06-05 19:54:03       96 阅读

热门阅读

  1. iOS ActivityViewController使用

    2024-06-05 19:54:03       34 阅读
  2. docker安装minio及minio的使用

    2024-06-05 19:54:03       33 阅读
  3. axios学习

    2024-06-05 19:54:03       29 阅读
  4. 什么是封装?为什么是要封装?

    2024-06-05 19:54:03       27 阅读
  5. Python 变量相除:深入探索与实战解析

    2024-06-05 19:54:03       28 阅读
  6. 如何把docker里的内容拷贝出来

    2024-06-05 19:54:03       29 阅读
  7. Python开发入门:从基础到实践的全方位探索

    2024-06-05 19:54:03       25 阅读
  8. 前端--导出

    2024-06-05 19:54:03       34 阅读
  9. AI 领域未来的 5 个预测

    2024-06-05 19:54:03       33 阅读
  10. git 下载失败

    2024-06-05 19:54:03       31 阅读
  11. Qt6 QSslSocket 客户端设计踩坑

    2024-06-05 19:54:03       31 阅读