2014-03-05 49 views
0

比較是否有必要聲明函數的原型?

int foo (int n) { 
return n; 
} 

VS

int foo(int); 

int foo (int n) { 
return n; 
} 

沒有任何理由在C++中聲明函數原型事先?我來自JAVA背景,所以我從來沒有聲明函數原型,這對我來說有點新鮮。

+1

該定義也作爲聲明。在函數被調用之前需要發生一個或另一個。 – Adam

回答

1

任何名稱應在使用前聲明。所以如果你使用一個函數名,它應該被聲明。一個函數的定義同時也是它的聲明。因此,有沒有必要寫

int foo(int); 

int foo (int n) { 
return n; 
} 

它是足夠簡單地定義函數

int foo (int n) { 
return n; 
} 

考慮到,編譯單元可以包含不是它的定義相同功能的若干聲明的帳戶。 。

0

不,不需要寫入原型,如果調用函數寫入之前調用函數。編寫原型以便編譯器可以理解後面定義的聲明函數。所以在這種情況下,即使被調用函數被寫入之後比調用函數,它也不會產生任何錯誤。

1

如果你想使用它,你只需要在定義之前聲明函數。

爲前

int foo(); 

int main(...) 
{ 
    //I can use foo now 
    int x = foo(): 

} 

趁現在這個接縫就像一個小的勝利,一旦你想它使一個更大的區別在多個cpp文件,你將最終需要,因爲沒有人可以管理100萬的共享功能在線源代碼文件。

所以現在我有

foo.h中

int Foo(); 

我現在可以在任何源使用的Foo()由包括標題

的main.cpp

#include "foo.h" 
int main(..) 
{ 
    //I can use it here 
    Foo(); 
} 

bob.cpp

#inlcude "foo.h" 
int doSomething() 
{ 
    // and here 
    Foo(); 
} 

而我只在foo.cpp中定義它;

首先這是必需的。如果你將這個定義放在標題中,那麼你將會遇到one definition rule。另外一個好處是它可以讓你的編譯時間快得多,你可以看到你是否把這個函數改成了一個模板函數,它可以讓你繞過odr。

相關問題