【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语言不支持函数重载

📝文章结语:

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

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

相关推荐
myloveasuka8 分钟前
Object&Objects
java·开发语言
小川zs8 分钟前
OpenClaw Gateway 频繁断开/重启问题诊断
linux·服务器·gateway
Java&Develop12 分钟前
查看 maven详细报错 打包
java
sibylyue12 分钟前
JDK 17 +spiring boot+ maven 应用服务 高并发调优
java·开发语言·maven
AMoon丶18 分钟前
Golang--锁
linux·开发语言·数据结构·后端·算法·golang·mutex
程序员一点19 分钟前
第23章:备份与灾难恢复策略
linux·运维·网络·数据库·openeuler
ฅ^•ﻌ•^ฅ128 分钟前
LeetCode hot 100(复习c++) 1-15
c++·算法·leetcode
艾莉丝努力练剑29 分钟前
确保多进程命名管道权限一致的方法
java·linux·运维·服务器·开发语言·网络·c++
tiany52432 分钟前
养虾记录-如何配置多agent和多个飞书机器人独立对话
java·前端·飞书
旺仔流奶啊~33 分钟前
idea使用Screw工具一键生成数据库文档详解
java·数据库·intellij-idea