如前面談過的,為了方便呼叫函式的程式編譯時,讓編譯器比對傳參變數型態的吻合,撰寫函式的人,除了提供函式程式檔案外,也要另外提供函式的原型,讓呼叫者可以在呼叫的程式碼中,宣告被呼叫函式的原型,或則把存放有原型宣告的前置碼檔 xxx.h 引入include 到呼叫函式的程式同一個原始檔案中以方便比對。 基本上函式原型,會重覆函式的頭一行,並去掉正式函式的大括號內部函式主體。
return_type function_name(type1 variable1,type2 variable2,...)
函式的呼叫使用(call function)
程式中會被一再重覆的程式段落在包裝成函式之後可以移出程式段落,移到另外在程式記憶體段落,而原來被重覆使用程式段落則會以函式呼叫指令來取代。當微電腦執行到函式呼叫指令時,便知道要跳到函式所在的記憶體段落去取得可執行碼來執行,再於函式執行完畢後回到原本呼叫函式的位置,繼續執行接續的程式段落。
例如:
float square(float x);
main(){
float para,return_value;
:
return_value=square(para);
:
}
程式前,要先宣告函式的原型float square(float x)。
程式中,要準備好收回傳值的變數,以及存放參數的變數,這些變數的名稱,可以與被呼叫函式所使用的名稱不同,但資料型態要一樣,如本範例,呼叫時參數名稱為para 與 函式原型float square(float x)使用參數變數名稱 x 不一樣,但型態都是 float。呼叫接收回傳值的變數是return_value 與被呼叫函式內部提供回傳值的變數名稱y 不一樣,但型態都是float。呼叫時,以回收值變數return_value等於呼叫函式代入傳參square(para)。
return_value=square(para);
呼叫函式使用的輸入傳參,也可以不是變數,而是常數。例如:
return_value=square(1.5);
當微控器執行呼叫函式時,會由括號()內取出參數列字串,不論字串內是常數或變數,編譯器都能夠找出其數值,並以函式格式之參數型態將他編為數據,再存入堆疊,並且在程式依據函式名稱找到函式記憶段落位置跳過去執行時,再將這些數據,依序從堆疊中取出,初始化函式內同一型態的傳參變數。