在C中,如果在块作用域中声明的对象没有链接,为什么main()中的函数声明没有" extern"工作?

时间:2014-09-01 14:49:58

标签: c function declaration extern linkage

据我所知,C中的对象有3种类型的链接:1)外部2)内部和3)none,并且在块范围内声明的对象(如在函数体内)没有链接,除非前面带有关键字"的extern"或"静态"。

但是为什么然后下面的函数声明能够链接到main()函数下面的定义,即使我没有使用" extern"申报期间?请解释一下,因为它完全颠覆了我对这个主题的理解。谢谢。

#include<stdio.h>

int main()
{
int foo();  //working even though I've not used "extern"
printf("%d",foo());
}

int foo()
{
return 8;
}

上述计划的结果:8

2 个答案:

答案 0 :(得分:5)

  

并且在块范围内声明的对象(在函数体内)没有链接,除非前面带有关键字&#34; extern&#34;或&#34;静态&#34;。

功能不是对象。

C11中的6.2.2说

  

-5-如果函数的标识符声明没有存储类说明符,则确定其链接与使用存储类说明符extern声明的完全相同。如果对象的标识符声明具有文件范围而没有存储类说明符,则其链接是外部的。

第一句话说在文件范围声明的函数就像用extern声明一样。即使在块范围内声明,这也适用。下一段是:

  

-6-以下标识符没有链接:声明为对象或函数以外的任何标识符;声明为函数参数的标识符;在没有存储类说明符extern的情况下声明的对象的块作用域标识符。

这就是块范围对象没有链接,但没有功能。

你不能在ISO C中使用嵌套函数,因此如果它没有引用块之外的东西,那么能够声明一个块作用域函数是没有意义的。

答案 1 :(得分:1)

功能不是对象。所以你对对象的看法并不适用于函数。