C 速查手冊

函數原型的宣告

C 語言的函數 (function) 定義前可以先做函數原型 (prototype) 的宣告,這樣一來,可以讓編譯器 (compiler) 檢查函數原型與定義的型態是否相符,同時這樣一來,函數定義可以放在 main() 的後面,或是其他的檔案中。

函數原型的宣告形如

datatype name(datatype, ...);

以之前介紹過的指數函數為例,加入函數原型的宣告如下

#include <stdio.h>

int exponent(int, int);

int main(void)
{
    int i;
    
    for (i = 0; i <= 10; i++) {
        printf("%2d%5d\n", i, exponent(2, i));
    }
    
    return 0;
}

int exponent(int a, int x)
{
    int result = 1;
    
    while (x > 0) {
        result *= a;
        x--;
    }
    
    return result;
}

/* 《程式語言教學誌》的範例程式
    http://kaiching.org/
    檔名:exponent2.c
    功能:測試指數函數,從 2 的 0 次方列印到 10 次方
    作者:張凱慶 */

exponent() 原型的宣告放在 main() 之前,實際定義則可以放在 main() 之後

int exponent(int, int);

宣告函數原型僅需提供參數 (parameter) 的型態,也可以同時提供參數名稱,由於編譯器會忽略任何在函數原型宣告所提供的參數名稱,因此函數原型的參數名稱可以與函數定義的參數名稱不相同,這裡我們建議可以不在函數原型中提供參數名稱。

編譯然後執行這個程式,結果如下

$ gcc exponent2.c
$ a.out
 0    1
 1    2
 2    4
 3    8
 4   16
 5   32
 6   64
 7  128
 8  256
 9  512
10 1024
$

我們可以看到 exponent2.cexponent1.c 的執行結果相同。

另外一個常用到函數原型宣告的地方,就是發展大型程式時,將介面與實作分開的軟體工程概念。這是說,把函數宣告放在自訂的標頭檔中,這就是介面,然後函式定義放到另一個檔案中,那就是實作,最後另寫一個含 main() 的可執行程式。

回 C 速查手冊首頁