c++基础(函数重载和函数重载的实现和extern“c“的用法)

1.函数重载和函数重载的实现

函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的
形参列表(参数个数 或 类型 或 顺序)必须不同,常用来处理实现功能类似数据类型不同的问题
下面这个是函数重载
代码

int add(int left, int right)
{
	return left + right;
}

double add(double left, double right)
{
	return left + right;
}

下面这个是函数重载吗?
代码

int add(int left, int right)
{
	return left + right;
}

int add(int left, int right)
{
	return left + right;
}

答案是 不是的重载要求类型不同

那么这样呢?
代码

int add(int left, int right)
{
	return left + right;
}

double add(int left, int right)
{
	return left + right;
}

答案也不是 因为重载和函数的返回值没关系

C语言是不支持函数重载的,c++支持,为什么c不支持呢?
在C/C++中,一个程序要运行起来,需要经历以下几个阶段:预处理、编译、汇编、链接。
而第四步链接除了链接库还有链接函数,链接器看到a调用Add,但是没有Add的地址,就会到b的符号表中找Add的地址,然后链接到一起,那么链接的时候会找那个名字呢?每个编译器都有自己的函数名修饰规则,windows难理解,linux容易理
解。所以我们用linux的命名规则来讲。
因为命名规则的问题比如add(int left, int right),linux的命名是z3addii,Z+函数长度+函数名+类型首字母,而c语言只是单纯的函数名,所以c语言不支持

2.extern “C”的用法

有些工程里比如c++要调用c语言的静态库或者c语言调用c++的静态库,那么我们就要用到extern“c”这个命令了

c++调用c的静态库

创建一个新项目
把要调用的函数复制一下
右键源文件的地方点现有项
在这里插入图片描述
把要调用的函数复制下来,我这里用的栈函数
在这里插入图片描述
点添加,这样子我们就不用重新写一份了
添加完成是这样的在这里插入图片描述

把stack.h左键一直按着拖到头文件哪里
在这里插入图片描述
我们来编译一下
在这里插入图片描述
报错了这是因为这不是应用程序而是一个库
右键在这里插入图片描述
点属性
在这里插入图片描述
选择好静态库,点应用,其实动态库也可以的
重新生成解决方案
在这里插入图片描述
没有报错,以前是生成.exe文件现在是生成.lib的文件

那我们来调用一下
在这里插入图片描述
查看自己的位置把要调用的函数给包进来

在这里插入图片描述
…/代表着上层目录
运行一下
在这里插入图片描述

报错了,这个报错说明编译过了,链接没过
为什么报错,因为c找不到c++的函数,c和c++的命名规则不同,所以链接的时候报错了
找到之前生成的.lib的文件复制名字
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
添加之前那个库的debug路径
再到文件前加入
在这里插入图片描述
运行一下
在这里插入图片描述
没有问题
为什么要用{}来分割呢!是要告许编译器这是用extern“C"声明的函数,是c库要用c的方法来实现

c调用c++

偷懒的话不创新文件,把文件后缀改了c++变成c,c变成c++改了,主函数把c++的东西删了,记得库改回应用程序,再改成静态库,再生成一次,再把之前的依赖项删了重新添加,这样子就可以了
运行
在这里插入图片描述
报错了,为什么报错,因为c找不到c++的函数,c和c++的命名规则不同,所以链接的时候报错了
那么怎么办,这个时候条件编译就要上场了
给库加上
在这里插入图片描述
__cplusplus是c++专属的标识,如果是c++就用extern”C“,不是就不用
运行一下
在这里插入图片描述
没有问题

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值