函数重载:
在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++即可通用.