解析C++中函数重载的实现原理
来源:互联网 发布:零售行业数据 编辑:程序博客网 时间:2024/06/15 03:02
什么是函数重载?
函数重载是指在同一作用域内,可以有一组具有相同函数名,不同参数列表的函数,这组函数被称为重载函数。重载函数通常用来命名一组功能相似的函数,这样做减少了函数名的数量,避免了名字空间的污染,对于程序的可读性有很大的好处。
剖析C++是如何实现重载的?
几个同名的重载函数仍然是不同的函数,它们是如何区分的呢?我们自然想到函数接口的两个要素: 参数与返回值。如果同名函数的参数不同(包括类型、顺序不同),那么容易区别出它们是不同的函数。如果同名函数仅仅是返回值类型不同,有时可以区分,有时却不能。例如:void Function(void);int Function (void); 上述两个函数,第一个没有返回值,第二个的返回值是 int 类型。如果这样调用函数:int x = Function (); 则可以判断出 Function 是第二个函数。问题是在 C++/C 程序中,我们可以忽略函数的返回值。在这种情况下,编译器和程序员都不知道哪个 Function 函数被调用。所以只能靠参数而不能靠返回值类型的不同来区分重载函数。编译器根据参数为每个重载函数产生不同的内部标识符。例如编译器为示例 8-1-1 中的三个 Eat 函数产生象_eat_beef、_eat_fish、_eat_chicken 之类的内部标识符(不同的编译器可能产生不同风格的内部标识符)。 如果 C++程序要调用已经被编译后的 C 函数,该怎么办? 假设某个 C 函数的声明如下:void foo(int x, int y); 该函数被 C 编译器编译后在库中的名字为_foo,而 C++编译器则会产生像_foo_int_int之类的名字用来支持函数重载和类型安全连接。由于编译后的名字不同,C++程序不能直接调用 C 函数。C++提供了一个 C 连接交换指定符号 extern“C”来解决这个问题。 例如:extern “C”{void foo(int x, int y);... // 其它函数} 或者写成extern “C”{#include “myheader.h”... // 其它 C 头文件} 这就告诉 C++编译译器,函数 foo 是个 C 连接,应该到库中找名字_foo 而不是找_foo_int_int。C++编译器开发商已经对 C 标准库的头文件作了 extern“C”处理,所以我们可以用#include 直接引用这些头文件。 转自:《高质量C/C++编程指南》
解析面试题:在C++ 程序中调用被 C 编译器编译后的函数,为什么要加 extern “C”声明?
函数和变量被C++编译后在符号库中的名字与C语言的不同,被extern "C"修饰的变量和函数是按照C语言方式编译和连接的。由于编译后的名字不同,C++程序不能直接调用C 函数。C++提供了一个C 连接交换指定符号extern“C”来解决这个问题。
阅读全文
0 0
- 解析C++中函数重载的实现原理
- 解析C++中函数重载的实现原理
- 解析c++中函数重载的实现原理
- C++中函数重载的实现原理
- C++中函数重载的实现原理
- c++中函数重载的实现原理
- C++ *深度解析*【函数重载】的实现原理
- 【C/C++】C++中函数重载原理
- 函数重载的实现原理
- c函数重载的实现
- C++函数重载实现的原理以及为什么在C++中调用C语言编译的函数时要加上extern "C"声明
- C++实现函数重载的原理
- C++实现函数重载的原理
- c++函数重载的实现原理
- c++函数重载的实现原理
- C++中函数重载的原理
- C++(多态实现原理)函数重写,重载,重定义
- 如何实现 C 的函数重载
- Eclipse(pyDev)导入Anaconda2发行版中的模块
- asp.net中TreeView的使用
- 3.longest substring
- pcl 画法线
- dfs序
- 解析C++中函数重载的实现原理
- 算法-->1,2维多项式
- MYSQL学习笔记(二十)使用游标
- Xcode 一键导入代码块 一键调用 提高开发效率
- Java常用类
- bootstrap学习总结分享
- 用训练好的caffemodel来进行分类
- HTML5实现简单的拖放功能
- 算法题练习系列之(十九): 程序运行时间