函數重載:
函數重載是函數的一種特殊情況,c++允許在同一作用域下聲明幾個同名函數,但是整幾個同名函數的形參列表必須不相同(參數個數不同,參數的類型(對應位置的參數),順序也不相同)
返回值不一樣不能視爲函數重載
爲什麼c++支持函數重載?而c語言不行?
首先我們看一下編譯的過程:預處理:頭文件展開/去註釋/宏替換 test.i
編譯:檢查語法 test.s
彙編:轉換成機器碼 test.o
鏈接:將各個.c文件糅合到一起編譯 a.out
在來看一個例子
在這個代碼中如果這個文件是一個.c 那麼這個文件肯定是編譯不過去的 ,肯定會報錯,這是因爲C語言與c++的函數名修飾規則不同
函數名修飾規則:函數的名字修飾(Decorated Name)就是編譯器在編譯期間創建的一個字符串,用來指明函數的定義或原型。
如果函數名字,調用約定,返回值類型或函數參數有任何改變,原來的名字修飾就不再有效,必須指定新的名字修飾
我們可以先看一下c++語言的函數命名規則:函數名(括號裏是地址)
在LINUX系統下實測
我們很明顯的看到c++裏的首先是_,Z是符號表的開始,4是函數名的長度,ii是兩個參數的類型的第一個字母,因爲Func函數眉頭參數則直接是void型
我們再來看一下c的命名規則我們可以很明顯的看到func1函數之前加了一個_(括號裏依舊是地址)
栗子
我們很明顯的看到直接就是Func無任何修飾