帶你從編碼角度分析C 過載原理

2022-09-20 18:24:08 字數 995 閱讀 7905

目錄

函式過載的即是在相同作用域中的多個函式,它們具有相同的名字而型參不同,但是在c++中他們可以正常編譯,不會因為同名而出現error。這是因為在c++利用了name mangling(傾扎)技術,在對程式編譯之前,編譯器將會用引數個數和引數型別對每乙個函式識別符號進行專門編碼。

接下來我們將會使用c++和c中分別實現**,使用nm命令來檢視可執行檔案的中編譯後的函式名是怎樣的?

我們借用如下**分別使用c和c++的編譯器編譯執行,來進行分析。

int add(int a, int b)

float add(float a, float b)

int main()

c語言分析:

我們將上述**放入overofjeajspload.c的檔案中,使用c的編譯器進行分析,將會出現報錯如下:

這就是因為在我們的程式中有兩個同名的函式,也證明了c語言無法實現過載。那程式設計客棧麼我們修改這段**,去掉乙個add函式,具體**如下:

int add(int a, int b)

int main()

編譯通過,生成可執行文www.cppcns.com件a.out,我們使用nm 可執行檔名查詢該可執行檔案中編譯過的函式名如下:

我們會發現在c的編譯器下,編譯過的函式名和我們程式中自定義的函式名是相同的。程式設計客棧接下來我們使用c++的編譯器來進行編譯。

c++分析

將不做修改的**放入乙個overload.cpp檔案中,使用c++編譯器進行編譯,會發現這次不會報錯,這也是c++中函式過載的結果,我們直接使用nm來檢視編譯過的函式名。

我們會發現函式名發生了改變,這就是c++的編譯器對程式中的函式中的每乙個函式名進行了編碼,其中的_z是規定字首,3是函式名的個數,i是引數列表型別int的首字母。這個過程我們稱作「名字改編」或「名字修飾」,型別安全的連線使得程式能夠呼叫合適的過載函式並保證了引數傳遞的一致性。

注意:main函式不會進行名字改編。

本文標題: 帶你從編碼角度分析c++過載原理

本文位址:

從設計角度分析MVC

ps 原來寫文章是從來也不寫提綱的,現在通過不斷的設計訓練和 注釋的影響,沒提綱就寫不下去了 言歸正傳,mvc作為一種軟體設計模式,它用一種業務邏輯 資料和介面顯示互相分離的方法組織 將業務邏輯單獨封裝,使得在介面及與使用者互動的形式改變時不影響到邏輯。1 模式簡介 mvc是一種建立web應用程式的...

從CMMI角度分析公司管理缺陷

為乙個有志向的軟體設計人員,如果還不清楚 cmmi是什麼的話,那麼你就永遠成不了乙個合格的軟體開發設計人員。系統的了解cmmi的每個過程,對於乙個軟體開發工程師是有必要的,對於軟體開發的管理者更是有必要。我們公司的管理混亂是出了名的吧,其實公司上層 領導自己心裡也很明白,我們作為一般的員工也隱隱感到...

從原始碼角度分析RACObserve的實現原理(一)

racobserve是個巨集,racobserve target,keypath 最終是執行 target rac valuesforkeypath keypath target,keypath observer self 這就牽出nsobject racpropertysubscribing ca...