2014-11-02 107 views
0

爲什麼C有函數聲明爲什麼在C中使用函數聲明?

℃實施例中果殼

//circle.c: Calculate and print the areas of circles 

#include <stdio.h> 

double circularArea(double r); 

int main() 
{ 
    double radius = 1.0, area = 0.0; 
    printf("  Areas of Circle\n\n"); 
    printf("  radius   Area\n" 
      "-------------------------\n"); 

    area = circularArea(radius); 
    printf("%10.1f  %10.2f\n", radius, area); 

    radius = 5.0; 
    area = circularArea(radius); 
    printf("%10.1f  %10.2f\n", radius, area); 

    return 0; 
} 

double circularArea(double r) 
{ 
    const double pi = 3.14159265; 
    return pi * r * r; 
} 

什麼是打字的目的 「雙circularArea(雙R);」在第五行?

+0

原型的目的是這樣的,在調用函數時,編譯器知道參數類型和返回類型。早期版本的C會讓所有這些項目的假設都是'int'。 C的後續版本將引發編譯警告/錯誤。 – user3629249 2014-11-02 11:37:55

回答

4

C編譯器從上到下處理源文件。當遇到函數的使用時,它需要知道函數的參數和返回類型。您必須在使用它之前聲明或定義函數,因此它知道這些類型。

因此,您可以將curcularArea的定義移動到main()之前,或者您可以在main()之前進行聲明。

一種常見的風格是將所有函數的聲明放在文件的開頭。然後你可以按任意順序定義你的所有函數,而不必擔心哪些調用是先放置所有的依賴關係。另外,如果你有相互遞歸的功能,定義的排序不會起作用,你需要聲明其中的一個。

+0

好的,這是有道理的。所以編譯器必須知道它是「存在」並且是在main {}之後定義的。如果我想main {}出現在程序的頂部,這可能會有用嗎?如果我不介意它在哪裏,我可以在main {}之前定義所有函數,然後在main {}中調用它們。 – bjd2385 2014-11-02 03:03:53

+0

我剛剛添加了另一個段落來解決這個問題。 – Barmar 2014-11-02 03:04:42

+0

這很有道理,謝謝! – bjd2385 2014-11-02 03:04:45

1

編譯器從top變爲bottom!因此,如果您在main(現在是not declared)撥打function這是undefined!所以這個錯誤不會出現,你可以在top上寫一個declaration來說編譯器嘿這個函數是在main之後出現的,但是它在那裏!

+0

如果我在main()之前定義函數會怎麼樣? – bjd2385 2014-11-02 03:02:17

+1

@ bd1251252是的,這是一個很好的問題;)那麼你不必做出這樣的聲明,因爲在函數的調用中它已經知道了!只是玩這個測試吧!複製你的主要功能並刪除前向聲明 – Rizier123 2014-11-02 03:03:14

0

編譯器一行一行地執行。沒有聲明,當編譯器在main()函數中遇到circularArea的使用時,它不知道那是什麼錯誤。該聲明基本上是對編譯器的承諾,您將在稍後使用該簽名定義函數。

0

C本質上是單遍的,這意味着在編譯器已知它們之前,不能使用符號(變量,宏,函數)。

聲明使編譯器已知的符號在翻譯單元(文件)中可用並從此開始。

這些聲明被收集在頭文件中以避免重寫它們時的錯誤,並便於重用和分離編譯。

本地符號在第一個使用點之前與聲明一起引入,以允許在多個符號之間進行遞歸引用。
這些聲明被稱爲前向聲明。

雖然可以不需要使用前向聲明,但避免重複的更簡單的解決方案就是在第一個使用點之前移動函數定義,因爲定義也是聲明。

相關問題