第9课 - 函数重载分析(下)
第9課 - 函數(shù)重載分析(下)
1. 重載與指針
1.1 下面的函數(shù)指針將保存哪個(gè)函數(shù)的地址?
1.2 函數(shù)重載遇上函數(shù)指針
? 將重載函數(shù)名賦值給函數(shù)指針時(shí):
(1)根據(jù)重載規(guī)則挑選與函數(shù)指針參數(shù)列表一致的候選者
(2)嚴(yán)格匹配候選者的函數(shù)類型與函數(shù)指針的函數(shù)類型 (這里不僅需要匹配參數(shù)類型,還需要匹配返回值的類型,不然編譯會(huì)出錯(cuò)!!!)
1 #include <stdio.h> 2 #include <string.h> 3 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后面的分號(hào) 20 21 int main(void) 22 { 23 int c = 0; 24 pFunc p = func; 25 26 c = p(1); // 根據(jù)pFunc指針的類型選擇對(duì)應(yīng)的重載函數(shù) 27 28 printf("c = %d\n", c); 29 30 return 0; 31 } 函數(shù)重載 VS 函數(shù)指針1.3 注意事項(xiàng)
(1)函數(shù)重載必然發(fā)生在同一個(gè)作用域中
(2)編譯器需要用參數(shù)列表或函數(shù)類型進(jìn)行函數(shù)選擇 【函數(shù)指針和參數(shù)的間接關(guān)系,函數(shù)指針中包含了返回值和參數(shù)類型的信息】
(3)無(wú)法直接通過(guò)函數(shù)名得到重載函數(shù)的入口地址
2. C++ 和 C 的相互調(diào)用
2.1 C++ 和 C 的相互調(diào)用
(1)實(shí)際工程中C++ 和C 代碼相互調(diào)用是不可避免的
(2)C++?編譯器能夠兼容C 語(yǔ)言的編譯方式
(3)C++?編譯器會(huì)優(yōu)先使用C++ 編譯的方式
(4)extern?關(guān)鍵字能強(qiáng)制讓C++ 編譯器進(jìn)行C 方式的編譯
【編程實(shí)驗(yàn)】C++ 調(diào)用C 函數(shù)
1 int add(int a, int b); add.h 1 #include "add.h" 2 3 //該文件的編譯,得到目標(biāo)文件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.h> 2 3 //該文件的編譯 4 //g++ main.cpp add.o 5 6 #ifdef __cplusplus 7 extern "C" { 8 #endif 9 10 //C++中以C的方式編譯:將add的函數(shù)名就是目標(biāo)名 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.cpp2.2?如何保證一段C代碼只會(huì)以C的方式被編譯?
(1)__cplusplus 是 C++ 編譯器內(nèi)置的標(biāo)準(zhǔn)宏定義
(2)__cplusplus 的意義:確保C代碼以統(tǒng)一的C方式被編譯成目標(biāo)文件
【編程實(shí)驗(yàn)】C 調(diào)用 C++ 函數(shù)?(其中的C++ 函數(shù)由gcc 編譯)
1 //該文件的編譯,得到目標(biāo)文件add.o 2 //g++ -c add.c 3 4 #ifdef __cplusplus 5 extern "C" { 6 #endif 7 8 //C++中以C的方式編譯:add的函數(shù)名就是目標(biāo)名 9 int add(int a, int b); 10 11 #ifdef __cplusplus 12 } 13 #endif add.h 1 #include "add.h" 2 3 //該文件的編譯,得到目標(biāo)文件add.o 4 //g++ -c add.c 5 6 #ifdef __cplusplus 7 extern "C" { 8 #endif 9 10 //C++中以C的方式編譯:add的函數(shù)名就是目標(biāo)名 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.h> 2 #include "add.h" 3 //編譯方式: 4 //gcc main.c add.o 5 int main() 6 { 7 int c = add(1, 2); 8 9 printf("c = %d\n", c); //3 10 11 return 0; 12 } main.c【編程實(shí)驗(yàn)】C 調(diào)用 C++ 函數(shù)?(其中的C++ 函數(shù)由g++ 編譯)
①假設(shè)別人提供了編譯好的cpp的頭文件和.o目標(biāo)文件,但其中的函數(shù)是以C++方式編譯的,很明顯函數(shù)名是用C++方式命名的。我們的C文件里不方便使用這個(gè)的函數(shù)名。
②解決方案:做一個(gè)C++的封裝層,對(duì)其中的函數(shù)進(jìn)行一個(gè)封裝,然后再用extern? "c"編譯這些封裝層中的函數(shù),最后就可以在C文件中使用了。
?
★ 其他人編寫的C++代碼,其中的函數(shù)名是用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.h> 2 #include "addEx.h" 3 //編譯命令: 4 //gcc main.c addEx.0 add.o 5 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 注意事項(xiàng)
(1)C++ 編譯器不能以C 的方式編譯重載函數(shù),即如果在extern ?"C"塊里有兩個(gè)同名的函數(shù)里,則會(huì)編譯失敗。
(2)編譯方式?jīng)Q定函數(shù)名被編譯后的目標(biāo)名
ⅰ:C++ 編譯方式將函數(shù)名和參數(shù)列表編譯成目標(biāo)名
ⅱ:C 編譯方式只將函數(shù)名作為目標(biāo)名進(jìn)行編譯
3. 小結(jié)
(1)函數(shù)重載是C++ 對(duì) C 的一個(gè)重要升級(jí)
(2)函數(shù)重載通過(guò)函數(shù)參數(shù)列表區(qū)分不同的同名參數(shù)
(3)extern關(guān)鍵字能夠?qū)崿F(xiàn)C 和 C++ 的相互調(diào)用
(4)編譯方式決定符號(hào)表中的函數(shù)名的最終目標(biāo)名
?
轉(zhuǎn)載于:https://www.cnblogs.com/shiwenjie/p/7169678.html
總結(jié)
以上是生活随笔為你收集整理的第9课 - 函数重载分析(下)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 梦到已故的狗狗还活着什么预兆
- 下一篇: 垂直和水平居中方法小结