2012-02-08 104 views
3

代碼前瞻性聲明先行:功能內的另一個功能

void foo(int x) 
{ 
    void bar(int); //is this forward-decl legal? 
    bar(x); 
} 

void bar(int x) 
{ 
    //do stuff 
} 

在上面的代碼,foo電話bar,平時我把foobar之外的正向DECL,就像這樣:

void bar(int); 
void foo(int x) 
{ 
    bar(); 
} 

首先,我認爲可以將bar的正向decl放入foo,對不對?

其次,考慮這一點,如果barstatic功能是這樣的:

static void bar(int x) 
{ 
    //do stuff 
} 

那我應該怎麼前瞻性聲明呢?我的意思是應該前向decl採取或省略static

+0

如果這是C++,那麼你應該*不*在你的問題上有「c」標記,並且*應該*使用未命名的命名空間而不是'static'關鍵字。如果這是C,那麼你應該*不*在你的問題上有「C++」標記,並且*應該*將你的前向聲明標記爲'static'。 – ruakh 2012-02-08 02:30:09

+1

@ruakh:儘管有人堅持這樣說,但並不反對使用static。 「靜態」和未命名的名稱空間各有其優點。 – 2012-02-08 02:40:46

+0

@BenVoigt,優勢?如? – Alcott 2012-02-08 02:44:43

回答

6
  1. 是的,將前向聲明放在另一個函數中是合法的。然後它只能在該功能中使用。你使用的函數的命名空間將被使用,所以確保匹配。本標準規定:「對於給定實體的連續聲明隱含的聯繫應當達成一致。」 (第7.1.2節)。所以是的,原型也必須是static。然而,它看起來並不像將static聯動功能的原型放在另一個功能中是完全允許的。 「塊內不能有函數聲明」(同一節)。

+0

所以簡單地說,如果'bar'爲'static',我不能在'foo'裏面聲明'bar',對嗎? – Alcott 2012-02-08 02:56:52

+0

@Alcott:根據我對標準的閱讀,這是正確的。我會用Comeau進行測試,他們對標準具有接近完美的符合性(嗯,C++ 03,他們正在研究C++ 11)。 – 2012-02-08 02:57:57

4

是的,可以在函數內部放置前向聲明。只要編譯器在調用該函數之前就已經看到了它,它並不重要。您也可以在名稱空間中轉發聲明函數。然而,原型僅限於它們在範圍:

int blah() { 
    { void foo(); } 

    foo(); // error: foo not declared 
} 

其次,你只需要把static原型,否則編譯器會抱怨bar被宣佈extern(所有原型都隱含extern除非它們通過例如static)明確標記。請注意,static函數原型不能出現在函數內部。

+0

「靜態函數原型不能出現在一個函數內」,你的意思是,如果'bar'是'static',那麼我不能轉發declare'void bar(int);'或'static void bar(int) ;'foo'裏面? – Alcott 2012-02-08 02:43:16

+0

雖然您不能在不同的命名空間中轉發聲明函數。 – 2012-02-08 02:47:51

+0

@Alcott你不能轉發declare'static void bar(int);''foo'裏面。 – 2012-02-08 02:58:34