過載函式為什麼只在C 下

2021-07-31 11:14:01 字數 1408 閱讀 3646

在程式編寫過程中,我們很多時候能看到也用到過c++下的函式過載,在c語言中沒有函式過載,同樣的重在函式放在c語言中編譯就會出錯,在c++下面函式就不會出錯,下面我們來過載函式:

1、過載函式:兩個或者多個函式有同樣的名字,只是它們的返回型別和引數個數以及型別不同。例如:

void fun(int a);

void fun(int a, char b);

這兩個函式雖然引數個數不同,但他們名字相同,所以他們是過載函式。

2、看看原因:

(1)先用c語言和c++分別寫乙個帶過載的函式來看看:

(a)用c語言寫過載函式編譯結果:

在這裡因為我是用vs2010編的**,檔案格式為.cpp格式的,所以我用extern 「c」的方式讓編譯器在編譯**的時候拓展成c語言的形式來編譯,編譯無法通過。

(b)用c++寫過載函式編譯結果:

c++下的過載函式可以執行通過。

(2)原因:同樣兩個同名的函式只是因為用的語言不一樣乙個可以執行乙個報錯,原因就是因為c++程式在編譯的時候對函式名進行了「名稱修飾」,後者叫名稱矯正,他它根據函式原型中指定的形參型別對每個函式名進行加密,例如:

int fun(int a, char ch);

在這裡我們看到的是乙個fun有兩個引數、乙個是int型別的、乙個是char型別的、返回值為int型別的函式,但是在編譯器下就不是這樣的了,我們調出來看看c++編譯器下的函式名:

這裡為了看編譯器下面的函式名,用只宣告了函式,通過報錯檢視的;也可以通過編譯器的彙編視窗來看函式名!

int  fun(int a,char ch)-- (**?fun@@yah**hd@z)//在編譯器裡區分只看引數型別

int fun(int a)-- (**?fun@@yah**h@z)

這裡大家應該能明白上面說的c++對函式名的「名稱修飾」是怎麼回事了吧,也能看到c++下面的過載函式是通過判斷函式名、引數來區分的,我們再看看c語言下的函式名:

c語言中的函式名都是_fun,不像c++下面當函式名一樣的時候通過函式引數來區分兩個函式的。

通過對比我們明白為什麼過載函式只能在c++下面出現,而c語言不支援過載的原因了。

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...

C 函式過載,為什麼C不可以?

乙個詞可以有多重含義,我們可以根據上下文判斷該詞真實的含義,即該詞被過載了 比如有句話說的是 能穿多少穿多少 在冬天和夏天來看這句話的理解是不一樣的。函式過載是函式的一種特殊情況,c 允許在同乙個作用域中宣告幾個功能類似的同名函式,這些同名函式的形參列表 引數個數或型別或順序 必須不同。注意 如果兩...

39 C 為什麼不能過載

不能過載operator 和 operator 的原因是,無法在這兩種情況下實現內建操作符的完整語義。說得更具體一些,內建版本版本特殊之處在於 內建版本的 和 首先計算左邊的表示式,如果這完全能夠決定結果,就無需計算右邊的表示式了 而且能夠保證不需要。我們都已經習慣這種方便的特性了。我們說操作符過載...