1.剖析c++是如何實現過載的?
2.解析面試題:在c++ 程式中呼叫被 c 編譯器編譯後的函式,為什麼要加 extern 「c」宣告?
1.函式過載的實現原理
函式過載的定義:
當兩個及兩個以上函式共用乙個函式名,但是形參個數或者型別不同,編譯器根據實參與形參的型別及
個數的最佳匹配,自動確定呼叫那乙個函式。也就是說,
在同一作用域,一組函式名相同,引數列表不同(個數和型別),返回型別可同,可不同的情況下,編譯器根據呼叫者傳入的引數型別和個數可以唯一可以唯一確定呼叫哪個函式.
如下**:
void overloadfunc(intx,int d){}
void overloadfunc(intx, double d){}
void overloadfunc(doublex, int d){}
過載的底層原理
c++函式過載底層實現原理是c++利用傾軋技術,來改名函式名,區分引數不同的同名函式。
c++中,這三個函式如果在主函式中被呼叫選擇哪乙個,由編譯器自身決定。例如:
#include
using namespace std;
int add(int a, int b)
double add(double a, double b)
int main()
這段**兩個函式add引數的型別不同,在windows環境下linux環境下編譯器編譯完成後的函式名的命名風格也就不同。以下是在vs2013編譯器下編譯完成map檔案中的函式名,可以看出add命名發生改變,一般是 ?[函式名]@@yahhh@z(只用函式名和ya後面的格式和@z是固定的,剩下的都是固不定的,它的命名代了返回值的引數型別。(h—int,n—double,x—void)。
同樣在linux環境下,這段**中函式的命名也發生改變,一般是_z[函式名長度][函式名][引數列表的型別首字母]。
總的來說:原始檔通過編譯後,將相同函式名,按照一定的格式,改變成可以區分的,去除了函式在呼叫時的二義性,從而實現函式的過載。
2.c++程式中呼叫被c編譯器編譯的函式時,為何後面加extern"c"宣告
答:首先,extern是c/c++語言中表明函式和全域性變數作用範圍的關鍵字,該關鍵字告訴編譯器,其宣告的函式和變數可以在本模組或其它模組中使用。
通常,在模組的標頭檔案中對本模組提供給其它模組引用的函式和全域性變數以關鍵字extern宣告。extern "c"是連線申明(linkagedeclaration),被extern "c"修飾的變數和函式是按照c語言方式編譯和連線的。作為一種物件導向的語言,c++支援函式過載,而過程式語言c則不支援。函式被c++編譯後在符號庫中的名字與c語言的不同。例如,假設某個函式的原型為:void foo( int x, int y);該函式被c編譯器編譯後在符號庫中的名字為_foo,而c++編譯器則會產生像_foo_int_int之類的名字。這樣的名字包含了函式名、函式引數數量及型別資訊,c++就是靠這種機制來實現函式過載的。
所以,可以用一句話概括extern 「c」這個宣告的真實目的:
解決名字匹配問題,實現c++與c的混合程式設計。
解析C 中函式過載的實現原理
一 定義 當兩個及兩個以上函式共用乙個函式名,但是形參個數或者型別不同,編譯器根據實參與形參的型別及 個數的最佳匹配,自動確定呼叫那乙個函式,這就是函式的過載。換而言之,在同一作用域,一組函式名相同,引數列表不同 個數和型別 返回型別可同,可不同的情況下,編譯器根據呼叫者傳入的引數型別和個數可以唯一...
C 函式過載的實現原理
對於c 來說,多個函式可以同名,但是這些函式的引數型別必須不一樣,也就是說c 中相同的函式名函式引數不同代表了不同的函式,當你去呼叫這些函式時,編譯器可以根據你的傳入引數的型別去判斷你呼叫的是哪個函式。但是c 編譯器是怎麼實現的呢?先看看c對於函式的處理 執行命令 gcc s main c.c o ...
c 函式過載的實現原理
1.c 問什麼引入函式過載 在c語言中,如果我們寫兩個函式名相同的函式,編譯器會告訴我們,函式重定義的錯誤。我們還會遇到下面這個問題 如果我們寫乙個計算int型別的加法,另乙個計算double型別的加法,我們必須起兩個不同的函式名。而在c 中我們可以解決這兩個問題。我們可以用相同的函式名,只有引數列...