2016-04-08 77 views
-3

我要到K & R和我在函數一章,我有一個快速的問題:試圖瞭解函數原型

難道我總是要申報的功能原型?什麼決定了原型中的什麼樣的論點?它可以只是在函數定義中的兩個變量嗎?

謝謝!

+0

_您可以根據您的要求決定函數應具有哪些參數。如果你的工作是通過2個參數完成的,然後傳遞兩個參數。參數數量不是預定義的(_built-in函數是exception_)。 – ameyCU

+2

原型應該與函數定義完全相同,後跟';'。 C的老版本允許其他方式來做到這一點,但這些會導致混淆。如果函數定義(執行體)在實際調用之前出現在模塊中,則不需要原型 - 因爲編譯器已經知道它。 –

+0

不,你不需要總是聲明原型。如果你寫了幾個函數,那麼編寫原型將幫助你保持軌道。假設你需要一個函數,你只需要輸入一個原型,然後你應該完成這個功能。否則,你可以寫上面描述的@Weather Vane函數。 – cjahangir

回答

1

您應該始終聲明並使用原型語法定義您的函數;這樣做可以讓編譯器在函數調用中傳遞錯誤數量或類型參數的地方捕獲錯誤。 C仍支持不使用原型語法的聲明和定義,但僅支持古代代碼庫;你不應該使用舊的語法編寫新的代碼。

至於什麼參數進入原型,完全取決於函數需要做什麼。假設我正在爲數學庫中的pow()函數寫一個替換。我需要2個參數,一個是基礎,接下來的是指數:

double myPow(double base, int exp); // declaration, prototype syntax 
... 
double myPow(double base, int exp) // definition, prototype syntax 
{ 
    ... 
} 

您可以在聲明中省略該參數名:

double myPow(double, int); 

要緊的是數量和類型參數被指定。

舊式聲明和定義是這樣的:

double myPow(); // declaration, old syntax 
... 
double myPow(base, exp) // definition, old syntax 
    double base; 
    int exp; 
{ 
    ... 
} 

你不選擇你定義一個函數的參數的唯一時間是main功能;在您定義main的實現時,您無法確定要採用哪些參數。 main或者不採用任何參數:int類型和char **

int main(void) 

或兩個參數:

int main(int argc, char **argv) 

的實現爲main可以提供額外的原型(如一些Unix發現三分之一char **envp參數實現),但這僅限於實現 - 您不能爲main創建任意的接口。