double
add(
double left,
double right)
long
add(
long left,
long right)
例如上面的**,add函式的函式名字重複,但引數不同(包括引數的個數、型別不同)的函式。
這種情況在c語言的編譯中是不通過的,但c++卻可以。接下來我們來講解原因
實際我們的專案通常是由多個標頭檔案和多個原始檔構成,而通過我們c語言階段學習的編譯鏈結,我們可以知道,【當前a.cpp中呼叫了b.cpp中定義的add函式時】,編譯後鏈結前,a.o的目標檔案中沒有add的函式位址,因為add是在b.cpp中定義的,所以add的位址在b.o中。那麼怎麼辦呢?
那麼鏈結時,面對add函式,聯結器會使用哪個名字去找呢?
借助linux可以看到,使用c語言的編譯gcc的時候,遇到add函式,編譯器仍然是以函式名本身add去尋找該函式的實體,而當兩個函式名字相同僅僅是引數不同的時候,是無法辨別的,因此會出現錯誤
上圖是linux下g++編譯,我們看到,編譯器將add函式變成了:z3addii
這裡的z3是c++編譯特徵,重點在於後面的 ii ,這裡的ii其實就是int int ,也就是說c++編譯的時候會將函式的引數當作該函式的固有特徵,並結合函式名去尋找,這也就解釋了當函式名相同但引數不同的時候,編譯器可以分辨出兩個函式的不同。
注意:結合上述所講,我們不難得到,其實二者最大的區別就是c++編譯的時候去call某個函式,會將函式引數作為其本身的乙個特徵,但函式的返回值並沒有該點。因此常常會有筆試這樣考:寫了兩個函式,名稱引數相同但返回值不同,問是否為過載函式,答案當然不是。
為什麼C 支援函式過載而C語言不支援?
gcc和g 編譯的過程類似,細節處理不一樣 list.h list.c test.c 1.預處理 標頭檔案的展開 巨集替換 條件編譯 去掉注釋 list.i test.i 2.編譯 檢查語法錯誤 生成彙編 list.s test.s 3.彙編 將彙編 轉換成對應的機器 list.o test.o 4...
為什麼C 支援函式過載,而C語言不支援函式過載?
函式過載 c 允許在同一作用域中宣告幾個功能類似的同名函式,這些同名函式的形參列表 引數個數 或 型別 或 順序 必須不同,常用來處理實現功能類似資料型別不同的問題。c c 中程式執行起來,需要經歷一下幾個階段 在鏈結時,面對add函式,func函式,每個編譯器都有自己的函式名修飾規則。聯結器會使用...
C 筆記 C語言為什麼不能函式過載
函式過載 一 1 原因 c語言不能函式過載與函式編譯後函式名有關。2 c語言編譯後的 名稱為 函式名 c語言 int add int a,int b 這裡是有意只給宣告不給定義,int add int a,char b 出錯後會在顯示框顯示編譯後的函式名 int add char a,int b i...