高端网站建设设计公司有哪些,免费个人网页制作网站,怎么样让网站正常解析,惠州企业建站系统第9课 - 函数重载分析#xff08;下#xff09; 1. 重载与指针 1.1 下面的函数指针将保存哪个函数的地址#xff1f; 1.2 函数重载遇上函数指针 将重载函数名赋值给函数指针时#xff1a; #xff08;1#xff09;根据重载规则挑选与函数指针参数列表一致的候选者 #…第9课 - 函数重载分析下 1. 重载与指针 1.1 下面的函数指针将保存哪个函数的地址 1.2 函数重载遇上函数指针 将重载函数名赋值给函数指针时 1根据重载规则挑选与函数指针参数列表一致的候选者 2严格匹配候选者的函数类型与函数指针的函数类型 这里不仅需要匹配参数类型还需要匹配返回值的类型不然编译会出错 1 #include stdio.h2 #include string.h3 4 int func(int a)5 {6 return a;7 }8 9 int func(int a, int b)
10 {
11 return a b;
12 }
13
14 int func(const char *s)
15 {
16 return strlen(s);
17 }
18
19 typedef int (*pFunc)(int); // 注意typedef后面的分号
20
21 int main(void)
22 {
23 int c 0;
24 pFunc p func;
25
26 c p(1); // 根据pFunc指针的类型选择对应的重载函数
27
28 printf(c %d\n, c);
29
30 return 0;
31 } 函数重载 VS 函数指针 1.3 注意事项 1函数重载必然发生在同一个作用域中 2编译器需要用参数列表或函数类型进行函数选择 【函数指针和参数的间接关系函数指针中包含了返回值和参数类型的信息】 3无法直接通过函数名得到重载函数的入口地址 2. C 和 C 的相互调用 2.1 C 和 C 的相互调用 1实际工程中C 和C 代码相互调用是不可避免的 2C 编译器能够兼容C 语言的编译方式 3C 编译器会优先使用C 编译的方式 4extern 关键字能强制让C 编译器进行C 方式的编译 【编程实验】C 调用C 函数 1 int add(int a, int b); add.h 1 #include add.h
2
3 //该文件的编译得到目标文件add.o
4 //gcc -c add.c
5
6 int add(int a, int b)
7 {
8 return a b;
9 } add.c 1 #include stdio.h2 3 //该文件的编译4 //g main.cpp add.o5 6 #ifdef __cplusplus7 extern C {8 #endif9
10 //C中以C的方式编译将add的函数名就是目标名
11 #include add.h
12
13 #ifdef __cplusplus
14 }
15 #endif
16
17 int main()
18 {
19 int c add(1, 2);
20
21 printf(c %d\n, c); //3
22
23 return 0;
24 } main.cpp 2.2 如何保证一段C代码只会以C的方式被编译 1__cplusplus 是 C 编译器内置的标准宏定义 2__cplusplus 的意义确保C代码以统一的C方式被编译成目标文件 【编程实验】C 调用 C 函数 其中的C 函数由gcc 编译 1 //该文件的编译得到目标文件add.o2 //g -c add.c3 4 #ifdef __cplusplus5 extern C {6 #endif7 8 //C中以C的方式编译add的函数名就是目标名9 int add(int a, int b);
10
11 #ifdef __cplusplus
12 }
13 #endif add.h 1 #include add.h2 3 //该文件的编译得到目标文件add.o4 //g -c add.c5 6 #ifdef __cplusplus7 extern C {8 #endif9
10 //C中以C的方式编译add的函数名就是目标名
11 int add(int a, int b)
12 {
13 return a b;
14 }
15
16 #ifdef __cplusplus
17 }
18 #endif add.cpp 1 #include stdio.h2 #include add.h3 //编译方式4 //gcc main.c add.o5 int main()6 {7 int c add(1, 2);8 9 printf(c %d\n, c); //3
10
11 return 0;
12 } main.c 【编程实验】C 调用 C 函数 其中的C 函数由g 编译 ①假设别人提供了编译好的cpp的头文件和.o目标文件但其中的函数是以C方式编译的很明显函数名是用C方式命名的。我们的C文件里不方便使用这个的函数名。 ②解决方案做一个C的封装层对其中的函数进行一个封装然后再用extern c编译这些封装层中的函数最后就可以在C文件中使用了。 ★ 其他人编写的C代码其中的函数名是用C方式编译的但只提供的.h和.o文件 1 int add(int a, int b); add.h 1 #include add.h
2
3 //编译命令g -c add.cpp
4
5 int add(int a, int b)
6 {
7 return a b;
8 } add.cpp 1 int addEx(int a, int b); addEx.h 1 #include add.h
2
3 //编译命令
4 //g -c addEx.cpp
5
6 extern C int addEx(int a,int b)
7 {
8 return add(a, b);
9 } addEx.cpp 1 #include stdio.h2 #include addEx.h3 //编译命令4 //gcc main.c addEx.0 add.o5 6 int main()7 {8 int c addEx(1, 2);9
10 printf(c %d\n, c); //3
11
12 return 0;
13 } main.c主文件 2.3 注意事项 1C 编译器不能以C 的方式编译重载函数即如果在extern C块里有两个同名的函数里则会编译失败。 2编译方式决定函数名被编译后的目标名 ⅰC 编译方式将函数名和参数列表编译成目标名 ⅱC 编译方式只将函数名作为目标名进行编译 3. 小结 1函数重载是C 对 C 的一个重要升级 2函数重载通过函数参数列表区分不同的同名参数 3extern关键字能够实现C 和 C 的相互调用 4编译方式决定符号表中的函数名的最终目标名 转载于:https://www.cnblogs.com/shiwenjie/p/7169678.html