首先這個問題的答案是c++支援函式過載而c語言不支援函式過載。下面我們從程式編譯鏈結階段看看其中的原因。
先看看過載的定義,函式過載就是指:
在同一作用域類,一組函式的函式名相同,引數列表不同(個數不同或型別不同),返回值可同可不同。
那麼問題來了,為什麼c++支援函式過載,而c語言不支援呢?
從**的編譯到執行,在vc6.0或vs這種編譯器下,它是系統直接完成了翻譯與鏈結,直接生成了執行結果。
編譯器內部完成了翻譯部分:
1.預處理
1)標頭檔案展開
2)巨集的替換
3)去注釋
4)條件編譯
2.編譯過程:將高階語言轉為組合語言;
3.彙編過程:組合語言轉為二進位制程式;
4.鏈結部分:所引用的資料鏈結進來。
比如乙個函式的宣告如下:
void function(int x,int y);
在c語言中,編譯器在編譯後在庫中的名字為_function
在c++中,編譯器在編譯後在庫中的名字為_function_int_int
還有乙個函式的宣告如下:
void function(float x,float y);
在c語言中,編譯器在編譯後在庫中的名字為_function。而在c++中,編譯器在編譯後在庫中的名字為_function_float_float。在鏈結時,都是找名字進行鏈結的,就比如以上兩個函式,在c語言中兩個的名字一樣,就會在鏈結中報錯。c++中它們的名字不一樣,所以就不會報錯。
個人學習記錄,由於能力和時間有限,如果有錯誤望讀者糾正,謝謝!
C 支援函式過載,C語言不支援函式過載的原因
c 支援函式過載,c語言不支援函式過載的原因?函式過載 在同一作用域內,一組具有不同引數列表的同名函式。通常情況,這組函式具有相似的功能,函式過載有效解決了只由於引數型別不同而造成的函式名數量膨脹問題。而c 支援函式過載,c不支援函式過載的原因是 c 在編譯過程中對函式的重新命名規則是 函式名 引數...
為什麼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...
判斷支不支援分離編譯
為什麼模板不支援分離編譯?什麼時候會出現連線錯誤?如果是普通函式在乙個.cpp檔案中申明,在另外乙個.cpp檔案中定義時,是可以編譯且鏈結的,但是當不存在定義時,會出現連線錯誤。我們具體來分析這類的問題吧 鏈結就是把main.obj與array.obj合成.exe檔案,當鏈結找不到函式入口的時候就會...