c 函式過載的實現原理

2021-08-03 07:56:01 字數 1844 閱讀 3631

1.c++問什麼引入函式過載

在c語言中,如果我們寫兩個函式名相同的函式,編譯器會告訴我們,函式重定義的錯誤。我們還會遇到下面這個問題:如果我們寫乙個計算int型別的加法,另乙個計算double型別的加法,我們必須起兩個不同的函式名。而在c++中我們可以解決這兩個問題。我們可以用相同的函式名,只有引數列表不同可以。

2.函式過載的條件

(1)要求過載的函式必須在同乙個作用域

(2)函式的引數列表不同(引數個數不同和引數型別不同)

(3)返回值可同可不同。

3.下面我們用乙個列子來深入**函式過載的原理

下面**為測試**

#include

using

namespace

std;

int add(int a,int b)

double add(double a,double b)

int main()

結果分析

(1)linux平台

我們通過指令:objdump test -t 可以得到原始檔的彙編檔案

在彙編檔案中我們可以找到下面的內容

我試驗了好的函式,大致可以得出如下結論:c++**檔案會把相同函式解析成不同的彙編函式名,大概的解析方法是 _z[函式名長度][函式名][引數列表的型別首字母]。這樣的話,編譯器在呼叫同名函式時,就不會產生二義性,這樣就達到了函式過載的要求。

(2)在window平台下使用vs2013

要得到原始檔編譯後的檔案,我們需要在vs設定下,方法如下:工具欄「專案」—>屬性—->配置屬性—->鏈結器—->除錯—->對映檔案(設定為是);

然後我們在建立專案資料夾的debug裡面找.map檔案。我們就可以找到下面的內容

我們可以看到它的函式編譯後的命名和linux下的不同,大致格式為 ?[函式名]@@yahhh@z (只用函式名和ya後面的格式和@z是固定的,剩下的都是固不定的,它的命名代了返回值的引數型別。(h—int,n—double,x—void)

經過我的講解,我想函式過載的原理大概就清楚了把,總結下來就是:原始檔通過編譯後,將相同函式名,按照一定的格式,改變成可以區分的,去除了函式在代用時的二義性,從而實現函式的過載。

4.下面我們看下函式過載的乙個面試題

在c++ 程式中呼叫被 c 編譯器編譯後的函式,為什麼要加 extern 「c」宣告?

下c編譯下的函式名是下面的名稱

而在c++編譯下為

如果不加 extern 「c」宣告,c++不能找到相應的函式名,所以就出錯

如果加了extern 「c」宣告,就會告訴編譯器,我是c檔案,查詢時,請按c檔案解析後的名字來找我,所以就不會出錯。

總結:c++語言支援函式過載, c 語言不支援函式過載。函式被 c++編譯後在庫中的名字

。 c 語言的不同。假設某個函式的原型為: int add(int a,int b);該 函 數 被 c 編 譯 器 編 譯 後 在 庫 中 的 名 字 為 _foo, 而 c++編 譯 器 則 會 產 生 像_add之類的名字。

c++提供了 c 連線交換指定符號 extern「c」來解決名字匹配問題。

C 函式過載的實現原理

對於c 來說,多個函式可以同名,但是這些函式的引數型別必須不一樣,也就是說c 中相同的函式名函式引數不同代表了不同的函式,當你去呼叫這些函式時,編譯器可以根據你的傳入引數的型別去判斷你呼叫的是哪個函式。但是c 編譯器是怎麼實現的呢?先看看c對於函式的處理 執行命令 gcc s main c.c o ...

c 函式過載的原理

一 什麼是函式過載 函式過載是指在同一作用域內,可以有一組或者多組具有相同函式名,不同引數的函式,這組函式被稱為過載函式。過載函式通常用來命名一組功能相似的函式,這樣做減少了函式名的數量及複雜度,避免了名字空間的汙染,對於程式的可讀性有很大的好處。具體的函式例子 include using name...

解析C 中函式過載的實現原理

一 定義 當兩個及兩個以上函式共用乙個函式名,但是形參個數或者型別不同,編譯器根據實參與形參的型別及 個數的最佳匹配,自動確定呼叫那乙個函式,這就是函式的過載。換而言之,在同一作用域,一組函式名相同,引數列表不同 個數和型別 返回型別可同,可不同的情況下,編譯器根據呼叫者傳入的引數型別和個數可以唯一...