函数重载和extern“C“


前言

c++允许函数名相同的函数存在,并且可以引用c语言中的函数


一、函数重载是什么?

函数名相同,形参列表不同的一组函数

bool compare(int a, int b)
{
	return a > b;
}

bool compare(double a, double b)
{
	return a > b;
}

bool compare(const char* a, const char* b)
{
	return strcmp(a, b) > 0;
}

Tips:
         在同一作用域下的一组函数才能称为函数重载
         调用函数时,优先寻找离调用其最近的函数声明

二、为什么C语言不能进行函数重载,C++可以进行函数重载?

1.函数符号

编译C语言或C++源文件生成可执行文件,需要经过预编译、编译、汇编和链接这四个阶段,其中变量和函数需要产生对应的符号用来标识变量和函数,方便引用,产生函数符号的过程主要在汇编和链接这两个阶段

2.符号产生规则

C语言和C++产生符号的规则不同
C语言中函数符号由函数名组成,C++中函数符号由函数名和形参列表组成

例如:

int sum(int a, int b)
{
	return a + b;
}

对上面这个sum函数来说,C语言产生出来的函数符号为sum,C++产生的函数符号为sum_int_int
(这里给出的函数符号与编译器实际生成的函数符号还是有所差别,如果想查看函数符号需要借助其他工具查看)

在了解C语言和C++的符号产生规则后,可以知道C语言函数名相同,产生的函数符号相同,所以不能进行函数重载,C++函数名相同,但形参列表不同,产生的函数符号也不同,所以能进行函数。

Tip:
         编译C语言或C++源文件生成可执行文件的过程中,不能出现相同的符号,如果函数符号相同,编译器会报"符号重定义"的错误

3.extern “C”

C语言和C++产生符号的规则不同,那么如何在C++里引用C语言中的函数呢?
可以使用在C++中使用extern "C"关键字去声明要引用的函数

例如:

extern "C" int sum(int a, int b);

extern "C"是告诉g++编译器,按照C语言产生符号的规则生成函数符号,这样就可以在C++里引用C语言中的函数
Tip:
可以使用#ifdef和__cplusplus进一步处理

#ifdef __cplusplus
extern "C" {
#endif
	int sum(int a, int b);
#ifdef __cplusplus
}
#endif

g++编译器中内置了__cplusplus、__FILE__和__LINE__等宏,如果编译C语言源文件,extern "C"就会消失,如果编译C++源文件,extern "C"就会出现,g++编译器会按照C语言产生符号的规则生成函数符号


总结

函数名相同、形参列表不同的一组函数称为函数重载
C语言和C++产生符号的规则不同,C语言按照函数名产生函数符号,C++按照函数名和形参列表产生函数符号

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值