目录
在C++环境下建立三个测试文件:abc.h abc.cpp Test.cpp
1.函数重载概念
函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数 或 类型 或 顺序[不同类型的形参])必须不同,常用来处理实现功能类似数据类型不同的问题。
int Add(int a, int b)
{
return a + b;
}
double Add(double a, double b)
{
return a + b;
}
long Add(long a, long b)
{
return a + b;
}
int main()
{
Add(1, 2);
Add(1.0, 2.0);
Add(1L, 2L);
}
5.2名字修饰(name Mangling)
为什么C++支持函数重载而C语言不支持呢?
C++如何支持函数重载
在C/C++中,一个程序运行起来需要经历以下几个阶段:预处理、编译、汇编、链接。
1、预处理 —— 头文件展开、宏替换、条件编译、去除注释 test.i
2、编译 —— 检查语法、生成汇编代码 test.s
3、汇编 —— 把汇编代码转化成二进制的机器码 test.o
4、链接 —— 找调用函数的地址,链接对应上,合并在一起 a.out
在C++环境下建立三个测试文件:abc.h abc.cpp Test.cpp
abc.h
abc.cpp
Test.cpp
对程序进行编译链接
abcc.cpp中有函数的声明和定义、Test.cpp中有函数的声明和调用,在汇编完成之后abc.o、Test.o中会生成函数调用指令和符号表(记录函数名以及函数地址的映射)。Test.cpp中main函数的指令调用的函数在abc.cpp中定义,而在Test.cpp中只有声明没有定义,于是就执行链接到符号表中取得函数的地址对应上,但如果最后对应地址的函数没有定义好,程序执行就会报链接错误。
为什么C语言不支持函数重载呢?
C语言编译的时候就用原来的函数名<abc>、<abc>
C语言在编译阶段发现名为<abc>的函数有两个,无法区分开来,编译不通过,编译报错。
C++如何支持函数重载
<_z 函数名长度 函数名 类型首字母>
C++在编译时对函数名进行修饰生成的两个函数名<_z3abcid>、<_z3abcdi>。
C++在进行命名的时候将参数类型的首字母修饰带进命名规则中,从而将两个函数区分开来。
C/CPP程序如何调用CPP/C的静态库、动态库
5.4extern"C"
在C++工程中需要将某些函数按照C的风格来编译,在函数前加extern"C",告诉编译器,将该函数按照C语言规则编译。
extren "C" int Add(int a, int b);
int main()
{
Add(1, 2);
reutrn 0;
}
链接时报错:error LNK2019:无法解析外部符号_Add,该符号在函数_main中被引用。
5.4.1建立静态库
5.4.2调用静态库
在当前文件夹跳出去找到刚刚建立的静态库的Stack.h所在位置
../ 往上跳一层
../../ 往上跳两层
../../Stack_C/Stack_C/Stack.h 往上跳两层进到Stack_C文件夹中的Stack_C文件夹找到Stack.h
5.4.3 C++程序调用C
5.4.4C调用C++ (C++不能有函数重载)
Stack.h
有两种代码方式
1.
2.