C 函式過載

2021-09-01 20:18:35 字數 2267 閱讀 1097

函式過載:是函式的一種特殊情況,c++允許在同一作用域中宣告幾個功能類似的同名函式,這些同名函式的

形參列表(引數個數 或 型別 或 順序)必須不同,常用來處理實現功能類似資料型別不同的問題

int add(int left, int right)

double add(double left, double right)

long add(long left, long right)

int main()

下面兩個函式屬於函式過載麼?

short add(short left, short right

int add(short left, short right)

答案是不屬於,因為函式過載看的知識引數型別,而並不關注函式的返回型別。

接下來,我們一起來**一下,名字修飾這件事。

name mangling是一種在編譯過程中,將函式、變數的名稱重新改編的機制,簡單來說就是編譯器為了區分

各個函式,將函式通過某種演算法,重新修飾為乙個全域性唯一的名稱。

c語言的名字修飾規則非常簡單,只是在函式名字前面新增了下劃線。比如,對於以下**,在最後鏈結時就

會出錯:

int add(int left, int right);

int main()

int add(int left, int right);

double add(double left, double right);

int main()

在vs下,對上述**進行編譯鏈結,最後編譯器報錯:

error lnk2019: 無法解析的外部符號 "double cdecl add(double,double)" (?add@@yannn@z)

error lnk2019: 無法解析的外部符號 "int __cdecl add(int,int)" (?add@@yahhh@z)

通過上述錯誤可以看出,編譯器實際在底層使用的不是add名字,而是被重新修飾過的乙個比較複雜的名

字,被重新修飾後的名字中包含了:函式的名字以及引數型別。這就是為什麼函式過載中幾個同名函式要求

其引數列表不同的原因。只要引數列表不同,編譯器在編譯時通過對函式名字進行重新修飾,將引數型別包

含在最終的名字中,就可保證名字在底層的全域性唯一性。

最後我們再來談談extern"c"

有時候在c++工程中可能需要將某些函式按照c的風格來編譯,在函式前加extern "c",意思是告訴編譯器,

將該函式按照c語言規則來編譯。

extern "c" int add(int left, int right);

int main()

最後的最後,有幾個問題,回答一下:

void testfunc(int a = 10)

{ cout<

答:c語言不能函式過載與函式編譯後函式名有關。 c語言編譯後的**名稱為」_函式名」

編譯後函式名變化只是在原來的函式名前加了乙個下劃線,所以當同名的函式引數不同時,編譯器無法解析到他們的不同,因為它們編譯後的名稱都相同,所以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)

答:加乙個 extern "c"就可以實現了。

以上,歡迎指正~

mysql 函式過載 C 方法過載(函式過載)

在講解 c 構造方法 時提到定義構造方法時提到可以定義帶 0 到多個引數的構造方法,但構造方法的名稱必須是類名。實際上,這就是乙個典型的方法過載,即方法名稱相同 引數列表不同。引數列表不同主要體現在引數個數或引數的資料型別不同。在呼叫過載的方法時系統是根據所傳 遞引數的不同判斷呼叫的是哪個方法。例項...

C 函式 函式過載

如果同一作用域內的幾個函式名字相同但形參列表不同,我們稱之為過載函式。void print const char cp void print const int beg,const int end void print const int ia,size t size 這些函式接受的形參型別不一樣,...

C 函式過載

函式過載 overloaded function 在相同的作用域中的兩個函式,如果有相同的名字而形參表不同 注意 如果僅僅函式的返回值不同是不能實現函式過載 void func int int func int error,僅僅返回值不同是不能作為函式過載,這屬於函式重定義 形參表包括 引數的型別 ...