C++:重载函数的判断依据与extern “C“

函数重载

 C++允许在同一作用域中一个函数名定义多个函数,这些函数就构成了函数重载。其中①参数个数、②类型、③顺序,④关键字const都可以作为重载的依据,而参数名称(看后面反汇编文件的函数名与参数的关系即可知道)与返回值(暂且可以这么理解:返回值有时可以忽略,所以无法判断是哪个函数,干脆禁止这种操作)不能作为重载依据。看例子验证一下:

#include <iostream>

using namespace std; 

void func(int i);
void func(double d);
void func(int i, double d);
void func(double d, int i);
// int func(double d, int i);	// 返回值不能作为重载的依据,编译时出错 

class test{
public:
	void func(void)
	{
		cout << "no const" << endl;
	}
	
	void func(void) const
	{
		cout << "const" << endl;
	}
}; 

int main()
{
	// 参数个数、类型、顺序 
	func(100);
	func(100.0);
	func(100, 100.0);
	func(100.0, 100);
	
	// const还有多种情况,这里只列举类成员函数
	test t1;
	t1.func();
	
	const test t2;
	t2.func();	// 常对象只能调用常函数 
	
	return 0;
}



void func(int i)
{
	cout << "int" << endl;	
}

void func(double d)
{
	cout << "double" << endl;	
} 

void func(int i, double d)
{
	cout << "int n double" << endl;	
}

void func(double d, int i)
{
	cout << "double n int" << endl;	
}

/*
int func(double d, int i)
{
	cout << "double n int" << endl;	
}
*/

在Linux环境下使用g++ overload.cpp -o overload编译程序并且执行./overload命令运行程序查看输出:

int
double
int n double
double n int
no const
const

之所以可以允许定义多个同名函数,执行命令objdump -d overload > overload.dis反汇编查看一下vi overload.dis就知道,红色框框就是这些重载函数被“翻译”的结果,所以经过编译之后函数名就不是一样的了,框中的函数名后缀的i和d是参数类型的简写而不是参数名称(可以更改参数名进行验证)。程序中调用同名函数时就会根据以上四个重载依据调用不同函数:

在这里插入图片描述
.
.

extern “C”

 C++支持重载,而C不支持,也正是因为这个原因导致两者对同一函数的命名会不同。所以为了兼容C的代码,C++程序可以加上extern "C"进行处理:

#ifdef __cplusplus 	// cpp文件默认定义了该宏
extern "C"{			// 采用C的方式编译这部分代码
#endif

// C代码
 
#ifdef __cplusplus
}
#endif

如果感兴趣,可以对比cpp文件加上跟去掉extern "C"的汇编文件,对比一下两者对应的函数名。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

R-QWERT

你的鼓励是我最大的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值