名字修飾(name mangling)是一種在編譯
過程中,將函式、變數的名稱重新改編的機制,簡單來說就是編譯器為了區分各個函式,將函式通過一定演算法,重新修飾為乙個全域性唯一的名稱。
為什麼c語言不支援函式過載?
下面來驗證一下:
在c專案中輸入如下**:
int add(int left, int right);
int main()
生成解決方案時就會爆出如下錯誤:
在c++專案中輸入如下**:
int add(int left, int right);
double add(double left, double right);
int main()
生成解決方案時就會爆出如下錯誤:
通過案例可以看出,編譯器實際在底層使用的不是add名字,而是被重新修飾過的乙個比較複雜的名字,其中c++被重新修飾後的名字中包含了:函式的名字以及引數型別。這就是為什麼函式過載中幾個同名函式要求其引數列表不同的原因。只要引數列表不同,編譯器在編譯時通過對函式名字進行重新修飾,將引數型別包含在最終的名字中,就可保證名字在底層的全域性唯一性
。
有時候在c++工程中可能需要將某些函式按照c的風格來編譯,怎麼辦?
extern 「c」
在c++專案中輸入如下**:
extern "c" int add(int left, int right);
int main()
生成解決方案時就會爆出如下錯誤:
這說明在c++工程中函式前加上extern "c"
會按照c的風格來編譯
關於C 中的名字修飾以及 extern C
在c c 中,乙個程式要執行起來,需要經歷以下幾個階段 預處理,編譯,彙編,鏈結.而名字修飾是一種在編譯過程中,將函式,變數的名稱重新改變的機制,簡單來說就是編譯器為了區分各個函式,將函式通過某種演算法,重新修飾為乙個全域性唯一的名稱.在c語言當中的名字修飾規則非常簡單,只是在函式名字前面新增了下劃...
名字修飾約定和函式呼叫約定
所謂名字修飾約定,就是指變數名 函式名等經過編譯後重新輸出名稱的規則。比如源 中函式名稱為int func int a,int b 經過編譯後名稱可能為?func yahhh z func yghhh z func 8,也有可能與源 中名稱相同為func。影響編譯後輸出的名稱通常與名字修飾約定 ex...
函式呼叫約定與名字修飾約定
在windows下,由於很多語言支援動態鏈結庫技術,因此動態鏈結庫是一種很好的混合程式設計方法。語言對函式的約定有兩種 函式呼叫約定和名字修飾約定。不同語言預設的呼叫呼叫約定和函式的命名方式是不同的,要想不同的語言開發的動態鏈結庫能夠相互呼叫,那麼開發動態鏈結庫的語言和呼叫鏈結庫的語言的函式約定必須...