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

📝文章结语:

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

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

相关推荐
Prejudices3 分钟前
C++如何调用Python脚本
开发语言·c++·python
Daniel 大东4 分钟前
idea 解决缓存损坏问题
java·缓存·intellij-idea
单音GG6 分钟前
推荐一个基于协程的C++(lua)游戏服务器
服务器·c++·游戏·lua
wind瑞10 分钟前
IntelliJ IDEA插件开发-代码补全插件入门开发
java·ide·intellij-idea
HappyAcmen11 分钟前
IDEA部署AI代写插件
java·人工智能·intellij-idea
马剑威(威哥爱编程)16 分钟前
读写锁分离设计模式详解
java·设计模式·java-ee
鸽鸽程序猿17 分钟前
【算法】【优选算法】前缀和(上)
java·算法·前缀和
修道-032317 分钟前
【JAVA】二、设计模式之策略模式
java·设计模式·策略模式
qing_04060322 分钟前
C++——多态
开发语言·c++·多态
孙同学_22 分钟前
【C++】—掌握STL vector 类:“Vector简介:动态数组的高效应用”
开发语言·c++