2011-12-13 63 views
12

對我而言,這些術語在使用C編程語言時基本上是同義詞。在實踐中,我可能更傾向於「前向聲明」,而不是「原型」,而對於通過頭文件包含的原型,則需要「函數原型」。但是,當你考慮預處理後會發生什麼時,即使這是人爲的區別。也許我錯過了一些東西。術語:前向聲明與函數原型

對於何時使用一個詞與其他詞有何共識?

回答

6

IMO這些並不是真正的同義詞。 對我來說,「函數原型」是指函數名稱及其參數和返回類型。它不僅適用於你所謂的「前向聲明」。所有功能都有一個原型。

我們更經常地區分功能聲明及其相應的定義

+1

+1,雖然這是非常常見的使用單詞「原型」指的聲明。 – 2011-12-13 22:19:18

+0

我想你和@MatteoItalia已經總結出來了。當我應該使用術語聲明時,我一直使用術語原型。 – 2011-12-29 20:24:12

4

我將術語前向聲明用於以下類型的struct聲明並帶有定義。

struct Foo; 

函數聲明不需要是一個完整的原型,用於與預1989兼容性(K & R)C.

char *foo(); // NOT the same as char *foo(void) 
0

在C中的僅概念我知道的是區分聲明和定義之間。原型是一種聲明,可以隨時隨地發生,定義是給定對象的實際實現。通過這個概念,沒有什麼東西叫前向聲明,它只是一個聲明的命令。

-1

我不知道是否有一個共識,但我認爲這樣做是最徹底的方法:

  • 放置在頭文件中的聲明,從來沒有在源或.c文件。 (我想你指的聲明時,你說向前聲明。)
  • 將在源文件中的所有定義

我不喜歡的地方在申報文件,因爲你可以有衝突的聲明沒有C,其中的錯誤可引起段錯誤,例如:如果AC具有

int foo(char *str_one, char *str_two, char *str_three); 

和BC具有

int foo(char *str_one, char *str_two); 

,你不會得到警告,也沒有錯誤,並且從b.c調用foo()將不會將所有參數放在堆棧上,這意味着foo()只會從堆棧中獲取某些東西,並將其視爲str_three,可能會導致出現段錯誤。所以對於我來說,聲明會轉到頭文件並且定義會轉到源文件。

+2

靜態函數的聲明應該放在它們在imho中定義的C文件中,最好在開頭。 – 2011-12-14 06:37:47

6

術語「原型」是指特定的聲明語法;具體而言,函數的參數的數量和類型出現在聲明中。鑑於的

int foo(int a, char *b) {...} 

功能定義可以有以下任何聲明的:

int foo();    // a declaration, but not a prototype 
int foo(a, b);   // a declaration, but not a prototype 
int foo(int, char *);  // a declaration and a prototype 
int foo(int a, char *b); // a declaration and a prototype