到目前為止都只使用一個函式(Function),也就是 main()
主函式,,若某些程式碼經常使用,可以抽出成為新函式以便重覆呼叫,函式用來將程式組織為一個小的、獨立的運行單元,一個函式可以接受資料,並運行其中的算法,最後將結果傳回。
函式的組成主要包括四個部份:返回值、函式名稱、參數列與函式主體。前三者稱為函式宣告或函式原型(Function prototype),C 語言規定,如果函式是在 main
之後實作,必須在 main
之前進行宣告,否則會出現編譯錯誤。
函式原型定義了函式的外觀,通常定義在獨立的標頭檔,而被含入每個想呼叫函式的檔案中,以下是一個函式宣告的範例:
math.h
int power2(int);
int power(int, int);
在 C 中如果呼叫函式不傳回任何值,則宣告為 void
,若不傳入任何引數,則參數列保持空白即可,也可以使用 void
來加以註明,標頭檔案被儲存為 .h 檔案,接著可以根據函式原型來實作函式主體,例如,在 math.c 中撰寫:
math.c
#include "math.h"
int power2(int num) {
return power(num, 2);
}
int power(int n, int p) {
int r = 1;
for(int i = 0; i < p; i++) {
r *= n;
}
return r;
}
在含括標頭檔案時,若標頭檔案與含入標頭檔的文件在同一個目錄下,那麼就使用雙引號 ""
來包括標頭檔案名稱,如果是標準或專案專屬的標頭檔,例如 C 的標準標頭檔,那麼則使用角括號 <>
來括住,編譯器在尋找時就會從設定的目錄中開始尋找。
接著可以在含入標頭檔後,直接呼叫所定義的函式,例如在 main.c 中撰寫:
main.c
#include <stdio.h>
#include "math.h"
int main(void) {
int num = 0;
int p = 0;
printf("輸入數值:");
scanf("%d", &num);
printf("輸入平方:");
scanf("%d", &p);
printf("%d 平方:%d\n", num, power2(num));
printf("%d 的 %d 次方 %d\n", num, p, power(num, p));
return 0;
}
可以使用 gcc math.c main.c
來編譯,執行結果如下:
輸入數值:10
輸入平方:3
10 平方:100
10 的 3 次方:1000
在編譯時期,編譯器會檢查被呼叫的函式,若無法根據函式名稱、提供的引數型態與函式宣告上參數型態來決定被呼叫的函式,會出現編譯錯誤,這就是必須先作函式宣告的原因,這對編譯器的檢查工作是必要的資料。