對我而言,這些術語在使用C編程語言時基本上是同義詞。在實踐中,我可能更傾向於「前向聲明」,而不是「原型」,而對於通過頭文件包含的原型,則需要「函數原型」。但是,當你考慮預處理後會發生什麼時,即使這是人爲的區別。也許我錯過了一些東西。術語:前向聲明與函數原型
對於何時使用一個詞與其他詞有何共識?
對我而言,這些術語在使用C編程語言時基本上是同義詞。在實踐中,我可能更傾向於「前向聲明」,而不是「原型」,而對於通過頭文件包含的原型,則需要「函數原型」。但是,當你考慮預處理後會發生什麼時,即使這是人爲的區別。也許我錯過了一些東西。術語:前向聲明與函數原型
對於何時使用一個詞與其他詞有何共識?
IMO這些並不是真正的同義詞。 對我來說,「函數原型」是指函數名稱及其參數和返回類型。它不僅適用於你所謂的「前向聲明」。所有功能都有一個原型。
我們更經常地區分功能聲明及其相應的定義。
我將術語前向聲明用於以下類型的struct
聲明並帶有定義。
struct Foo;
函數聲明不需要是一個完整的原型,用於與預1989兼容性(K & R)C.
char *foo(); // NOT the same as char *foo(void)
在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,可能會導致出現段錯誤。所以對於我來說,聲明會轉到頭文件並且定義會轉到源文件。
靜態函數的聲明應該放在它們在imho中定義的C文件中,最好在開頭。 – 2011-12-14 06:37:47
術語「原型」是指特定的聲明語法;具體而言,函數的參數的數量和類型出現在聲明中。鑑於的
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
+1,雖然這是非常常見的使用單詞「原型」指的聲明。 – 2011-12-13 22:19:18
我想你和@MatteoItalia已經總結出來了。當我應該使用術語聲明時,我一直使用術語原型。 – 2011-12-29 20:24:12