过程声明和不匹配的定义

时间:2014-02-27 20:03:12

标签: c gcc

static void foo(void);

[.....]

void foo(void) {
    .....
}

产生静态范围的“foo”,而如果将“static”从声明移动到定义,则会出现错误。我不能制定一个让我理解的谷歌问题,但这对我来说似乎不合理......

有没有人有洞察力?

2 个答案:

答案 0 :(得分:0)

链接器需要函数声明来通过翻译单元解析调用。因此,如果将函数声明为static,则无法在转换单元外部访问它。

如果将functio声明为非静态,并将其定义为静态,则会出现错误,因为声明&定义不匹配,但名称相同。

答案 1 :(得分:0)

想象一下函数声明可能在标题中的典型情况。如果您声明函数NOT static,那么您告诉编译器“此函数在此转换单元之外可用”。然后该函数被定义为“仅在此翻译单元中可见”,这当然无法工作。

反过来(你写的方式),你的声明是说“这个功能在这个单元之外是不可用的”,定义是“顺便说一下,这里是函数”。这个定义并没有说静态这一事实不是重点。

不可否认,强制声明和定义之间的“静态”是相同的,但我认为它仍然有效。