【C++干货基地】C++:函数重载(深度解析Windows和Linux下函数的修饰规则)


🎬 鸽芷咕个人主页
🔥 个人专栏 : 《C++干货基地》《粉丝福利》

⛺️生活的理想,就是为了理想的生活!


引入

哈喽各位铁汁们好啊,我是博主鸽芷咕《C++干货基地》是由我的襄阳家乡零食基地有感而发,不知道各位的城市有没有这种实惠又全面的零食基地呢?C++ 本身作为一门篇底层的一种语言,世面的免费课程大多都没有教明白。所以本篇专栏的内容全是干货让大家从底层了解C++,把更多的知识由抽象到简单通俗易懂。

⛳️ 推荐

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。

文章目录

  • 引入
  • [⛳️ 推荐](#⛳️ 推荐)
  • 一、从编译原理分析
    • [1.1 源文件编译的完整过程](#1.1 源文件编译的完整过程)
  • [二、C++支持函数重载的原理--名字修饰(name Mangling)](#二、C++支持函数重载的原理--名字修饰(name Mangling))
      • [2.1 C语言和C++编译器编译对比](#2.1 C语言和C++编译器编译对比)
      • [2.2 linux下C++命名修饰规则](#2.2 linux下C++命名修饰规则)
      • [2.2 Windows下名字修饰规则](#2.2 Windows下名字修饰规则)
      • [2.3 windows 下函数名实例](#2.3 windows 下函数名实例)
  • 三、C++支持函数重载而C语言不支持总结
  • 📝文章结语:

一、从编译原理分析

为什么什么C语言不支持函数重载呢?这个需要和编译原理上来进行分析在我们对源文件进行编译的时候是需要进行

  • 4 个步骤的,他们分别是

1.1 源文件编译的完整过程

📑假设我们有,一个声明和定义分离的3个文件

  • 🌱那么他进行编译的过程一点是这样

    🔥 而在C语言 .o 文件在进行合并时是通过符号表来查找,但C语言生成的符号表函数名是唯一的所以

  • 函数重载:相同函数名形参列表 (参数个数 或 类型 或 类型顺序) 不同有不同函数功能也就实现不了

二、C++支持函数重载的原理--名字修饰(name Mangling)

而C++在此基础上在,C语言的基础上对符号表中的函数名做了新的修饰,所以同名但 (参数个数 或 类型 或 类型顺序) 不同的

  • 函数在符号表中,名字是不一样的了
  • 这也就是为什么C++中支持函数重载的原理

2.1 C语言和C++编译器编译对比

  • 这里就可以看到在linux下,采用gcc编译完成后 C语言文件,函数名字的修饰没有发生改变。
  • 在linux下,采用g++编译完成后,函数名字的修饰发生改变,编译器将函数参
    数类型信息添加到修改后的名字中。

2.2 linux下C++命名修饰规则

linux 下的函数修饰名实际上非常简单:

<_Z3Addii>
_Z 是修饰符
3 是函数名的符号数
后面跟的 ii 是 形参类型

2.2 Windows下名字修饰规则

以上是一些文档对Windows下函数名字修饰规则的一些解释再,windows中函数的名字修饰并不是很理解

windows下修饰符 修饰符所代表的意思
X void
D char
E unsigned char
F short
H int
I unsigned int
J long
K unsigned long(DWORD)
M float
N double
_N bool
U struct

2.3 windows 下函数名实例

好了前面说了怎么多下面我们就来看一下实际情况中 windowsvs 编译器对函数名是如何修饰的吧!

🍸 代码演示:

cpp 复制代码
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;

void ADD(int a, int b);
void ADD(double a, double b);
void ADD(char a, char b);

int main()
{
	ADD(1, 1);
	ADD(1.1, 1.1);
	ADD('a' , 'a');
	return 0;
}

📑代码结果:

三、C++支持函数重载而C语言不支持总结

    1. C++ 支持函数重载是因为 对函数名做了修饰,相同函数名形参列表 (参数个数 或 类型 或 类型顺序) 但修饰过后 所生成的函数符号不同,这样我们就可以根据 (参数个数 或 类型 或 类型顺序) 的同名函数来进行函数重载的支持!
    1. C 语言不支持函数重载是因为,在C语言中所生成的符号表中 函数名是唯一的所以C语言不支持函数重载

📝文章结语:

☁️ 看到这里了还不给博主扣个:
⛳️ 点赞🍹收藏 ⭐️ 关注

💛 💙 💜 ❤️ 💚💓 💗 💕 💞 💘 💖
拜托拜托这个真的很重要!
你们的点赞就是博主更新最大的动力!

相关推荐
嘵奇2 分钟前
最新版IDEA下载安装教程
java·intellij-idea
千墨5 分钟前
VMware安装Centos 9虚拟机+设置共享文件夹+远程登录
linux·运维·centos
FL162386312917 分钟前
[C++]使用纯opencv部署yolov12目标检测onnx模型
c++·opencv·yolo
JenKinJia23 分钟前
Windows10配置C++版本的Kafka,并进行发布和订阅测试
开发语言·c++
s_fox_28 分钟前
Nginx Embedded Variables 嵌入式变量解析(4)
java·网络·nginx
Jelena1577958579234 分钟前
使用Java爬虫获取1688 item_get_company 接口的公司档案信息
java·开发语言·爬虫
数据小小爬虫37 分钟前
Jsoup解析商品详情时,如何确保数据准确性?
java·爬虫
V+zmm101341 小时前
自驾游拼团小程序的设计与实现(ssm论文源码调试讲解)
java·数据库·微信小程序·小程序·毕业设计
ChinaRainbowSea1 小时前
1. Linux下 MySQL 的详细安装与使用
linux·数据库·sql·mysql·adb
wen__xvn1 小时前
每日一题洛谷P1914 小书童——凯撒密码c++
数据结构·c++·算法