2012-02-08 106 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