<C++ 初阶> C++入门——函数重载

目录

1.函数重载概念

5.2名字修饰(name Mangling)

在C++环境下建立三个测试文件:abc.h    abc.cpp   Test.cpp

C/CPP程序如何调用CPP/C的静态库、动态库

5.4extern"C"

5.4.1 建立静态库

 5.4.2 调用静态库

5.4.3 C++程序调用C

5.4.4 C程序调用C++ 


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++ 初阶> C++入门——函数重载_第1张图片

在C++环境下建立三个测试文件:abc.h    abc.cpp   Test.cpp

 abc.h 

<C++ 初阶> C++入门——函数重载_第2张图片

abc.cpp

<C++ 初阶> C++入门——函数重载_第3张图片

Test.cpp

 <C++ 初阶> C++入门——函数重载_第4张图片

对程序进行编译链接

<C++ 初阶> C++入门——函数重载_第5张图片

abcc.cpp中有函数的声明和定义、Test.cpp中有函数的声明和调用,在汇编完成之后abc.o、Test.o中会生成函数调用指令符号表(记录函数名以及函数地址的映射)。Test.cpp中main函数的指令调用的函数在abc.cpp中定义,而在Test.cpp中只有声明没有定义,于是就执行链接到符号表中取得函数的地址对应上,但如果最后对应地址的函数没有定义好,程序执行就会报链接错误

为什么C语言不支持函数重载呢?

<C++ 初阶> C++入门——函数重载_第6张图片

C语言编译的时候就用原来的函数名

C语言在编译阶段发现名为的函数有两个,无法区分开来,编译不通过,编译报错。

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建立静态库

<C++ 初阶> C++入门——函数重载_第7张图片 

<C++ 初阶> C++入门——函数重载_第8张图片

<C++ 初阶> C++入门——函数重载_第9张图片

 

 5.4.2调用静态库

<C++ 初阶> C++入门——函数重载_第10张图片

 <C++ 初阶> C++入门——函数重载_第11张图片

 

在当前文件夹跳出去找到刚刚建立的静态库的Stack.h所在位置

 

../  往上跳一层 

../../  往上跳两层

../../Stack_C/Stack_C/Stack.h  往上跳两层进到Stack_C文件夹中的Stack_C文件夹找到Stack.h

<C++ 初阶> C++入门——函数重载_第12张图片

<C++ 初阶> C++入门——函数重载_第13张图片 

5.4.3 C++程序调用C

5.4.4C调用C++ (C++不能有函数重载)

Stack.h

有两种代码方式

1.

<C++ 初阶> C++入门——函数重载_第14张图片

2.

 <C++ 初阶> C++入门——函数重载_第15张图片

 

你可能感兴趣的:(C++,c++,开发语言)