C 函式過載的實現原理

2021-07-24 19:17:04 字數 1051 閱讀 3122

對於c++來說,多個函式可以同名,但是這些函式的引數型別必須不一樣,也就是說c++中相同的函式名函式引數不同代表了不同的函式,當你去呼叫這些函式時,編譯器可以根據你的傳入引數的型別去判斷你呼叫的是哪個函式。但是c++編譯器是怎麼實現的呢?

先看看c對於函式的處理:

執行命令:gcc -s main_c.c -o main_c.s 得到如下內容

可以看到c編譯器那你的函式轉成彙編指令,定義你的函式名字的時候用的是語言來的函式名(當然前面加了乙個下劃線)

在看一段c++**

執行命令 g++ -s main_cpp.cpp -o main_cpp.s 得到

函式定義**

呼叫**

可以看到dguco_add(int ,int ) 變成了__z9dguco_addii 另外乙個變成__z9dguco_addff,很明顯ii代表兩個引數是int型別,ff代表函式兩個引數,引數是float型別,通過看彙編**,我們可以看到c++編譯器對過載函式做了什麼處理,她為每個函式轉成了不同的彙編實現,對於c語言來說這就是兩個函式。

由此我們看到,c++把過載函式的名字和引數型別結合在彙編曾給每個函式實現了自己的彙編實現,這樣每次去呼叫這個函式是,c++編譯器久根據引數型別去呼叫相應的函式。

這也是我們有時候在c++呼叫一些外部的c庫或者是引用一些c語言的標頭檔案時,要用extern 「c」,這個關鍵字可以讓編譯器改變編譯器對於這些函式的處理,讓編譯器在尋找這些函式對應的目標**時尋找c編譯器遍以後對應得函式塊,而不是c++的,否則就會出現找不到該函式的錯誤。

c 函式過載的實現原理

1.c 問什麼引入函式過載 在c語言中,如果我們寫兩個函式名相同的函式,編譯器會告訴我們,函式重定義的錯誤。我們還會遇到下面這個問題 如果我們寫乙個計算int型別的加法,另乙個計算double型別的加法,我們必須起兩個不同的函式名。而在c 中我們可以解決這兩個問題。我們可以用相同的函式名,只有引數列...

c 函式過載的原理

一 什麼是函式過載 函式過載是指在同一作用域內,可以有一組或者多組具有相同函式名,不同引數的函式,這組函式被稱為過載函式。過載函式通常用來命名一組功能相似的函式,這樣做減少了函式名的數量及複雜度,避免了名字空間的汙染,對於程式的可讀性有很大的好處。具體的函式例子 include using name...

解析C 中函式過載的實現原理

一 定義 當兩個及兩個以上函式共用乙個函式名,但是形參個數或者型別不同,編譯器根據實參與形參的型別及 個數的最佳匹配,自動確定呼叫那乙個函式,這就是函式的過載。換而言之,在同一作用域,一組函式名相同,引數列表不同 個數和型別 返回型別可同,可不同的情況下,編譯器根據呼叫者傳入的引數型別和個數可以唯一...