C 語言

函式原型

在你找承包商之前,先弄清楚他們需要你提供什麼、會交付什麼,是有幫助的——即使你還沒見過他們實際動工。函式原型就是函式的這種事前通知:它告訴編譯器函式的名字、它參數的型別、以及它的回傳型別,但沒有本體。有了它,編譯器就能在還沒見到真正定義之前,檢查每一個呼叫處。

原型看起來像把本體換成分號的定義:「int add(int a, int b);」。它宣布函式的形狀。當編譯器接著看到像 add(2, 3) 的呼叫,它能驗證你傳了正確數目與型別的引數、且你正確使用了結果。原型通常住在標頭檔裡,好讓許多原始檔都能呼叫一個定義只放在其中一個檔案裡的函式。它們也讓向前使用成為可能:一個函式可以在檔案中比它定義之處更早被呼叫,只要它的原型先出現。

為什麼重要:沒有可見的原型,較舊的 C 會對函式的引數與回傳型別套用一些假設規則,這會默默掩蓋錯誤——例如在要 int 的地方傳了 double。現代 C 要求你在使用前宣告函式,良好的做法是在一個到處被引入的標頭檔裡放一個原型。原型是宣告而非定義:它沒有本體、不配置任何程式碼;別處提供的定義必須與它完全相符。

/* 原型,常放在標頭檔 */ int add(int a, int b); /* 一個呼叫端,依原型受檢查 */ int main(void) { return add(2, 3); } /* 相符的定義,在別處 */ int add(int a, int b) { return a + b; }

原型讓 main 對 add 的呼叫在編譯器看到 add 本體之前就能做型別檢查。

原型是宣告而非定義——它沒有本體。它的參數與回傳型別必須與真正的定義完全相符;不相符是未定義行為,而非保證會報的錯。要宣告「不接受引數」請用 int f(void),而非 int f()。

又称
function declarationforward declaration函式宣告前向宣告