当前位置: 首页 > news >正文

函数重载

一、概念

C++ 允许在同一作用域中存在几个功能类似的同名函数,但这些同名函数的形参列表(参数个数 或 类型 或 顺序)必须不同

int Add(int left, int right)
{return left+right;
}double Add(double left, double right)
{return left+right;
}long Add(long left, long right)
{return left+right;
}int main()
{Add(10, 20);Add(10.0, 20.0);Add(10L, 20L);return 0;
}

二、名字修饰(Name Mangling) - 导致 C 和 C++ 代码不能直接相互调用

C/C++ 代码要运行起来,需要经历预处理、编译、汇编、链接这四个阶段,而 Name Mangling 是一种在编译期间将函数名重新修饰的机制,简单来说,就是编译器为了区分各个函数,通过 Name Mangling 保证在底层的全局唯一性

C 的名字修饰规则非常简单,只是在函数名前添加了下划线,这也是 C 不支持函数重载的原因

/** test.c*/
int Add(int left, int right);int main()
{Add(1, 2);  // 编译器链接报错:error LNK2019: 无法解析的外部符号 _Add,该符号在函数 _main 中被引用return 0;
}

由于 C++ 要支持函数重载、命名空间、类等,使得其名字修饰规则比较复杂,不同编译器在底层的实现方式可能会有差异

int Add(int left, int right);
double Add(double left, double right);int main()
{Add(1, 2);      // 编译器链接报错:error LNK2019: 无法解析的外部符号 "int __cdecl Add(int,int)" (?Add@@YAHHH@Z)Add(1.0, 2.0);  // 编译器链接报错:error LNK2019: 无法解析的外部符号 "double cdecl Add(double,double)" (?Add@@YANNN@Z)return 0;
}
函数签名修饰后名称
int func(int)?func@@YAHH@Z
float func(float)?func@@YAMM@Z
int C::func(int)?func@C@@AAEHH@Z
int C::C2::func(int)?func@C2@C@@AAEHH@Z
int N::func(int)?func@N@@YAHH@Z
int N::C::func(int)?func@C@N@@AAEHH@Z

三、extern “C” - 解决 C 和 C++ 代码间相互调用问题

有时候,C++ 工程中需要将某些函数按照 C 规则进行编译,在函数前加 extern “C”,意思是告诉编译器,将该函数按照 C 规则进行编译

extern "C" int Add(int left, int right);int main()
{Add(1,2);  // 链接时报错:error LNK2019: 无法解析的外部符号_Add,该符号在函数 _main 中被引用return 0;
}

C、C++ 混合调用


http://www.mrgr.cn/news/42634.html

相关文章:

  • Python的多线程与多进程:并发编程基础与实战
  • Kubernetes-Operator篇-02-脚手架熟悉
  • 设计模式-解释器模式
  • 探寻自闭症摘帽之路:充分了解康复关键
  • MySQL 查询优化器
  • python-FILIP/字符串p形编码/数字三角形
  • 02:(寄存器开发)流水灯/按键控制LED
  • 深入挖掘C++中的特性之一 — 继承
  • Java开发每日一课:21世纪最流行的语言,Java为什么这么火?
  • 21款奔驰GLE350升级智能辅助驾驶23P 抬头显示HUD 全景360影像案例
  • Javascript数组研究06_手写实现_shift_slice_some_sort_splice
  • 云原生化 - 工具镜像(简约版)
  • 【Node.js】worker_threads 多线程
  • 二叉树的广度优先和深度优先遍历
  • 传感器模块编程实践(一)AS608指纹模块简介及驱动源码
  • 精神状态不佳,行动力缺失
  • 11.1 Linux_线程_线程相关函数
  • 双十一有什么数码好物推荐?双十一不容错过的数码好物清单!
  • 角色动画——RootMotion全解
  • 进程状态及优先级