函数forward-declaration在另一个函数中

时间:2012-02-08 02:25:31

标签: c++ c static forward-declaration

代码优先:

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

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

在上面的代码中,foo调用了bar,通常我将bar的前向转换放在foo之外,如下所示:

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

首先,我认为将bar的forward-decl置于foo内是可以的,对吧?

其次,请考虑一下,如果barstatic这样的函数:

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

然后我应该如何向前宣布呢?我的意思是前向转换是取消还是省略static

2 个答案:

答案 0 :(得分:6)

  1. 是的,将前向声明放在另一个函数中是合法的。然后它只能在该功能中使用。并且将使用您放入其中的函数的命名空间,因此请确保匹配。

  2. 标准说:“对特定实体的连续声明所暗示的联系应达成一致。” (第7.1.2节)。所以是的,原型也必须是static。但是,它似乎不允许将static链接函数的原型放在另一个函数中。 “块内不能有static函数声明”(同一节)。

答案 1 :(得分:4)

是的,可以将前向声明放在函数中。只要编译器在调用函数之前看到它就没关系。您也可以在名称空间中转发声明函数。但是,原型仅限于它们所处的范围:

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

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

其次,您只需要将static放在原型上,否则编译器会抱怨bar被声明为extern(所有原型都是隐式{ {1}}除非明确标记为extern)。请注意,static函数原型不能出现在函数内。