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“,不是就不用
运行一下
没有问题