C語言爲什麼不支持函數重載

函數重載

在我們中國的文化中,一個詞可能是有多種含義,在這種情況下就可以通過上下文來判斷這個詞到底是什麼意思,在這裏我們就可以理解爲這個詞被重載了。
例:又是晴朗的而又美好的一天,可是小明的媽媽卻讓小明去打掃衛生,不打掃完不能出去玩,但是恰好小明這時候特別想出去和朋友一起打籃球,當她媽媽給他讓他去打掃衛生時,小明順口來了一句“ 我去 ”。那麼請問小明到底是去還是不去。其實這只是個玩笑而已,不過它卻很像我們的函數重載,下面就讓我們一起來看什麼是函數重載吧!

  • 什麼是函數重載?
    在我們C++中,允許我們在同一作用域中聲明同名的函數,這些同名的函數的形參列表不同就是我們的函數重載。
    形參列表(形參變量個數不同,形參變量類型不同,形參變量順序不同)

注:在這裏我們要注意一點,函數的返回值不同不構成函數重載

例:

  • 整數相加函數
int add(int a,int b){
	return a + b;
}
  • 浮點數相加函數
double add(double a,double,b){
	return a + b;																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																		
}

形如上面兩種寫法的函數就是函數的重載,第一個函數是用來計算兩個整數相加的,第二個函數是用來計算浮點數相加的,兩個函數的形參類型不同,所以這就構成了 add()函數的重載

  • 爲什麼要有函數重載?
    1、試想如果沒有函數重載機制,如在C中,假如我們要打印一些數據,你必須要這樣去做:爲這個print函數取不同的名字,如print_int、print_string。這裏還只是兩個的情況,如果是很多個的話,就需要爲實現同一個功能的函數取很多個名字,如加入打印long型、char*、各種類型的數組等等。這樣做很不友好!
    2、類的構造函數跟類名相同,也就是說:構造函數都同名。如果沒有函數重載機制,要想實例化不同的對象,那是相當的麻煩!
    3、操作符重載,本質上就是函數重載,它大大豐富了已有操作符的含義,方便使用,如+可用於連接字符串等!

既然我們知道了什麼是函數重載,那麼C++支持函數重載,那麼C語言爲什麼不支持函數重載呢?接下來就讓我們一起去探究一下函數的底層調用過程。

名字修飾

通過我們在寫好一個.c/.cpp文件的時候,點擊開始運行,那麼它就能運行起來,運行一個程序就這一步就好了嗎?其實當然不是,下面讓我們來看看我們C/C++中我們的程序到底是如何運行起來的。大致可以分爲4個階段,如下:

  1. 預處理階段(在預處理階段,會進行宏替換,條件編譯,頭文件展開,去店掉註釋)
  2. 編譯階段(在編譯階段,首先會進行語法語義檢錯,無誤後要將我們寫好的C文件編譯成彙編文件)
  3. 彙編階段(在彙編階段就是要將我們的彙編文件轉換成可執行的機器指令)
  4. 鏈接階段(在鏈接階段就是要把我們的所有的目標文件以及我們所依賴的庫文件鏈接到一起生成可執行程序)
    以上就是我們一個程序的執行過程,我們可以看到,在鏈接文件的時候,假如我們寫了一個重載函數add,那麼我們的重載函數在我們的C++底層中是如何處理的?很容易想到,在編譯過程中,編譯器會將我們的代碼編譯成彙編文件,這裏其實就存在這一種重命名機制,我們把它就叫做名字修飾。

名字修飾內容
1、在C語言中,編譯器在編譯過程會將我們的函數重命名,具體的方法就是在我們的函數名前加上“_“修飾符,通過這種方式就可以在我們的符號表種查找到了,但是假如有兩個相同的函數,編譯之後進行相同的重命名,在符號表中生成的函數名一樣,那麼就無法區分到底是哪個函數了,所以這也就是我們的C語言爲什麼不支持函數重載的原因了。
2、在C++中,既然支持函數重載,那麼它肯定對C語言在這方面進行了優化,具體的方法就是在我們的函數名後面加上參數然後生成我們符號表中的函數名稱。那麼這樣一來,就很容易理解了,爲什麼C++可以支持函數重載了,就是因爲函數重載底層的原理造成的,就是由於重載函數在符號表中生成的函數名稱不一樣,這樣就能區分到底是哪個函數了。這樣一來編譯就能通過了。

  • C++能否按照C語言的方式來編譯文件
    答案是肯定可以的,只需要在我們的函數前加上 extern ”C“ 即可。例如
extern "C" int add(int a,int b){
	return a + b;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章