C 函式過載實現的機制

2021-09-12 15:29:21 字數 1757 閱讀 9519

一、函式過載:在相同作用域內的 具有相同函式名不同引數列表(引數個數、型別、順序)的函式構成過載

在c中,我們對乙個功能函式要實現不同型別的呼叫時,就必須得取不同的名稱。如果呼叫的非常多就要起很多名字,這樣就增加了工作量,如果採用函式過載來宣告一組功能相似的函式,這樣做減少了函式名的數量,避免了名字空間的汙染,對於程式的可讀性有很大的好處

在c++的底層,有重新命名機制

舉例:

#includeusing namespace std;

int add(int left, int right)

double add(double left, double right)

long add(long left, long right)

int main()

通過上面的**實現,可以根據具體的add()的引數去呼叫對應的函式

底層的重新命名機制將add函式根據引數的個數,引數的型別,返回值的型別做了重新命名,那麼借助函式過載,乙個函式就有多種命名機制

在c++呼叫約定(_cdecl 呼叫約定)中add函式在底層被解析為:

"int __cdecl add(int,int)" (?add@@yahhh@z)

"double __cdecl add(double,double)" (?add@@yannn@z)

"long __cdecl add(long,long)" (?add@@yajjj@z)

(1)c++中可以通過在函式宣告前加 extern "c" 將乙個函式按照 c 語言的風格來進行編譯。

(2)c++語言支援函式過載。而c不支援函式過載。 

(3)函式在c中和c++中編譯過的函式名字是不一樣的。加上extern」c」是說明是說明c已經編譯過的。 

c++想要呼叫已經編譯過的c函式,由於編譯過的名字不同,是不能直接呼叫的,所以c++加extern「c」生命來解決這個問題。 

例如:假設某個函式的原型為: void foo(int x, int y);該函式被c 編譯器編譯後在庫中的名字為_foo, 而c++ 編譯器則會產生像_foo_int_int 之類的名字,加上extren」c」後,就相當於告訴編譯器,函式foo是個c編譯後的函式,在庫里應該找的是_foo,而不是_foo_int_int.

如上的三個add函式,在c++中被解析為:

"int __cdecl add(int,int)" (?add@@yahhh@z)

"double __cdecl add(double,double)" (?add@@yannn@z)

"long __cdecl add(long,long)" (?add@@yajjj@z)

在c語言中被解析為_add,三個一樣,所以不能進行區分,因此c語言不支援函式過載

底層的重新命名機制將add函式根據引數的個數,引數的型別,返回值的型別都做了重新命名。那麼借助函式過載,乙個函式就有多種命名機制。 

在c++呼叫約定(_cdecl 呼叫約定)中add函式在底層被解析為:

"int __cdecl add(int,int)" (?add@@yahhh@z)

"double __cdecl add(double,double)" (?add@@yannn@z)

"long __cdecl add(long,long)" (?add@@yajjj@z)

c++中可以通過在函式宣告前加extern "c"將乙個函式按照 c 語言的風格來進行編譯。

函式過載的實現機制

函式過載是一種特殊情況,c 允許在同一作用域中宣告幾個類似的同名函式,這些同名函式的形參列表 引數個數,型別,順序 必須不同,常用來處理實現功能類似資料型別不同的問題。為了實現函式過載的功能,函式名就不能再作為乙個函式的唯一標識,而是使用了name mangling方法將函式名轉化為了乙個獨一無二的...

oracle 函式 實現過載 C 函式過載

一 函式過載的概念 在實際開發中,有時候我們需要實現幾個功能類似的函式,例如把變數的值寫入檔案,變數的型別可能是int long double char,通過引數把變數傳入函式。在c語言中不允許函式同名,程式設計師只能設計出四個不同名的函式,其函式宣告如下 bool writetofile int ...

C 函式過載的實現原理

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