9_函數(shù)重載分析(下)

關(guān)鍵詞: 函數(shù)重載與指針、 extern關(guān)鍵字、 C和C++相互調(diào)用

1. 重載與指針

  • 將重載函數(shù)名賦值給函數(shù)指針時(shí)
    1. 根據(jù)重載規(guī)則挑選與函數(shù)指針參數(shù)列表一致的候選者
    2. 嚴(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)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容