代码优先:
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
内是可以的,对吧?
其次,请考虑一下,如果bar
是static
这样的函数:
static void bar(int x)
{
//do stuff
}
然后我应该如何向前宣布呢?我的意思是前向转换是取消还是省略static
?
答案 0 :(得分:6)
是的,将前向声明放在另一个函数中是合法的。然后它只能在该功能中使用。并且将使用您放入其中的函数的命名空间,因此请确保匹配。
标准说:“对特定实体的连续声明所暗示的联系应达成一致。” (第7.1.2节)。所以是的,原型也必须是static
。但是,它似乎不允许将static
链接函数的原型放在另一个函数中。 “块内不能有static
函数声明”(同一节)。
答案 1 :(得分:4)
是的,可以将前向声明放在函数中。只要编译器在调用函数之前看到它就没关系。您也可以在名称空间中转发声明函数。但是,原型仅限于它们所处的范围:
int blah() {
{ void foo(); }
foo(); // error: foo not declared
}
其次,您只需要将static
放在原型上,否则编译器会抱怨bar
被声明为extern
(所有原型都是隐式{ {1}}除非明确标记为extern
)。请注意,static
函数原型不能出现在函数内。