c++的基础知识:函数重载

函数重载:

C语言里,在同文件里不可以有同名的函数.c++里可以有多个函数同名.


例如我们要实现不同类型变量的add函数:


1

2 #include <iostream>

3

4 using namespace std;

5

6 int add(int a, int b)

7 {

8 cout << "int add" << endl;

9 return a+b;

10 }

11

12 double add(double a, double b)

13 {

14 cout << "double add" << endl;

15 return a+b;

16 }

17

18 double add(double a, int b, int c)

19 {

20 return b+c;

21 }

22

23 int main(void)

24 {

25 cout << add(33, 44) << endl;

26 cout << add(33.111, 44.11) << endl;

27

28 return 0;

29 }


编译执行后的输出:

[root@localhost 04func_overloaded]# ./a.out

int add

77

double add

77.221


说明c++里可实现多个同名的函数,编译时编译器会自动根据参数的个数及类型调用相应的函数.


揭秘:

查看程序镜像里的函数名:

[root@localhost 04func_overloaded]# nm a.out | grep add

0000000000400a87 t _GLOBAL__sub_I__Z3addii

0000000000400944 T _Z3adddd

0000000000400990 T _Z3adddii

0000000000400910 T _Z3addii


说明在C++里最终编译生成的函数名与代码里写的函数名并不完全相同,与参数的个数,参数的类型有关系.与返回值类型无关.与参数名也无关.


C代码里编译出的程序里的函数名与源文件名里的函数名相同.

1

2 #include <stdio.h>

3

4 int add(int a, int b)

5 {

6 return a+b;

7 }

8

9 int main(void)

10 {

11 return 0;

12 }

13


gcc编译后查看:

[root@localhost 04func_overloaded]# nm a.out | grep add

00000000004004f0 T add



c++在使用C语言写好的库时的问题:

C编译出的库的函数名是固定的,与源文件名里相同。

C++编译时,函数是与参数个数,参数类型变化的。所以在C++里调用C库的函数时需要作一些处理.

mylib.h

1

2 #ifndef __MYLIB_H

3 #define __MYLIB_H

4

5 void myhello(char *);

6

7 #endif /* __MYLIB_H */


mylib.c编译成C动态库

1

2 #include <stdio.h>

3

4 void myhello(char *p)

5 {

6 printf("in mylib : %s\n", p);

7 }


编译成动态库:gcc mylib.c -fPIC -shared -o libmylib.so


c++里调用上面的动态库,则需libmylib.so mylib.h

1

2 #include <iostream>

3 #include "mylib.h"

4

5 int main(void)

6 {

7 myhello("kkk");

8 return 0;

9 }


[root@localhost usage]# g++ test.cpp ./libmylib.so

test.cpp: In function ‘int main()’:

test.cpp:7:15: warning: deprecated conversion from string constant to‘char*’ [-Wwrite-strings]

myhello("kkk");

^

/tmp/ccK5RkCU.o: In function `main':

test.cpp:(.text+0xa): undefined reference to `myhello(char*)'

collect2: error: ld returned 1 exit status


编译时还是报错,找不到myhello函数。因c++这边需要找函数名像:_Z3myhellopc这样的函数,我们的库的函数名不是这样的.

我们要告诉编译器,此函数是C语言写的,函数名是不变的才行.

修改C++代码如下即可编译通过:

1

2 #include <iostream>

3

4 extern "C" {

5 #include "mylib.h"

6 };

7

8 int main(void)

9 {

10 myhello("kkk");

11 return 0;

12 }




通过情况下是写库这边需要作兼容的行为的:

修改mylib.h

1

2 #ifndef __MYLIB_H

3 #define __MYLIB_H

4

5 #ifdef __cplusplus

6 extern "C" {

7 #endif

8 void myhello(char *);

9

10 #ifdef __cplusplus

11 }

12 #endif

13

14 #endif /* __MYLIB_H */


修改后,不管是在C还是C++即可通用.


猜你喜欢

转载自blog.csdn.net/gz_sgkj/article/details/80506867