int foo (int n) {
return n;
}
VS
int foo(int);
int foo (int n) {
return n;
}
沒有任何理由在C++中聲明函數原型事先?我來自JAVA背景,所以我從來沒有聲明函數原型,這對我來說有點新鮮。
int foo (int n) {
return n;
}
VS
int foo(int);
int foo (int n) {
return n;
}
沒有任何理由在C++中聲明函數原型事先?我來自JAVA背景,所以我從來沒有聲明函數原型,這對我來說有點新鮮。
任何名稱應在使用前聲明。所以如果你使用一個函數名,它應該被聲明。一個函數的定義同時也是它的聲明。因此,有沒有必要寫
int foo(int);
int foo (int n) {
return n;
}
它是足夠簡單地定義函數
int foo (int n) {
return n;
}
考慮到,編譯單元可以包含不是它的定義相同功能的若干聲明的帳戶。 。
不,不需要寫入原型,如果調用函數寫入之前調用函數。編寫原型以便編譯器可以理解後面定義的聲明函數。所以在這種情況下,即使被調用函數被寫入之後比調用函數,它也不會產生任何錯誤。
如果你想使用它,你只需要在定義之前聲明函數。
爲前
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。
該定義也作爲聲明。在函數被調用之前需要發生一個或另一個。 – Adam