關(guān)鍵詞: 函數(shù)重載與指針、 extern關(guān)鍵字、 C和C++相互調(diào)用
1. 重載與指針
- 將重載函數(shù)名賦值給函數(shù)指針時(shí)
- 根據(jù)重載規(guī)則挑選與函數(shù)指針參數(shù)列表一致的候選者
- 嚴(yán)格匹配候選者的函數(shù)類型與函數(shù)指針的函數(shù)類型
編程實(shí)驗(yàn):函數(shù)重載VS函數(shù)指針
#include <stdio.h>
#include <string.h>
int func(int i)
{
return i;
}
int func(int a, int b)
{
return a + b;
}
int func(const char* s)
{
return strlen(s);
}
typedef int(*PFUNC)(int a);
int main(int argc, char* argv[])
{
int c = 0;
PFUNC p = func;
c = p(1);
printf("%d\n", c);
return 0;
}
輸出結(jié)果:
1
- 注意事項(xiàng)
- 函數(shù)重載必然發(fā)生在同一個(gè)作用域中
- 編譯器需要用參數(shù)列表和函數(shù)類型進(jìn)行函數(shù)選擇,在函數(shù)重載遇見(jiàn)函數(shù)指針的時(shí)候需要匹配函數(shù)類型
- 無(wú)法直接通過(guò)函數(shù)名得到重載函數(shù)的入口地址
2. C++和C相互調(diào)用
- 實(shí)際工程在C++和C代碼相互調(diào)用是不可避免的
- C++編譯器能夠兼容C語(yǔ)言的編譯方式,但一般情況下會(huì)優(yōu)先使用C++編譯的方式
-
extern關(guān)鍵字強(qiáng)制讓C++編譯器進(jìn)行C方式的編譯
extern "C"
{
// do C-style compilation here
}
問(wèn)題:如何保證一段C代碼不論在C編譯器下或是在C++編譯器下只會(huì)以C的方式被編譯?
解決方案:
-
__cplusplus是C++編譯器內(nèi)置的標(biāo)準(zhǔn)宏定義 -
__cplusplus的意義:確保C代碼以統(tǒng)一的C方式被編譯成目標(biāo)文件
#ifdef __cplusplus
extern "C" {
#endif
// C-Style Compilation
#ifdef __cplusplus
}
#endif
注意事項(xiàng):
- C++編譯器不能以C的方式編譯重載函數(shù)
- 編譯方式?jīng)Q定函數(shù)名被編譯后的目標(biāo)名
- C++編譯方式將函數(shù)名和參數(shù)列表編譯成目標(biāo)名
- C編譯方式只將函數(shù)名作為目標(biāo)名進(jìn)行編譯
3. 小結(jié):
- 函數(shù)重載是C++對(duì)C的一個(gè)重要升級(jí)
- 函數(shù)重載通過(guò)函數(shù)參數(shù)列表區(qū)分不同的同名函數(shù)
-
extern關(guān)鍵字能夠?qū)崿F(xiàn)C和C++的相互調(diào)用,但是在extern代碼塊中絕對(duì)不能有重載函數(shù) - 編譯方式?jīng)Q定符號(hào)表中的函數(shù)名和最終目標(biāo)名
聲明:此文章僅是本人在學(xué)習(xí)狄泰學(xué)院《C++深度解析教程》所做的筆記,文章中包含狄泰軟件資料內(nèi)容,一切版權(quán)歸狄泰軟件所有!
實(shí)驗(yàn)環(huán)境:gcc version 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04.3)