据我所知,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
答案 0 :(得分:5)
并且在块范围内声明的对象(在函数体内)没有链接,除非前面带有关键字&#34; extern&#34;或&#34;静态&#34;。
功能不是对象。
C11中的6.2.2说-5-如果函数的标识符声明没有存储类说明符,则确定其链接与使用存储类说明符
extern
声明的完全相同。如果对象的标识符声明具有文件范围而没有存储类说明符,则其链接是外部的。
第一句话说在文件范围声明的函数就像用extern
声明一样。即使在块范围内声明,这也适用。下一段是:
-6-以下标识符没有链接:声明为对象或函数以外的任何标识符;声明为函数参数的标识符;在没有存储类说明符
extern
的情况下声明的对象的块作用域标识符。
这就是块范围对象没有链接,但没有功能。
你不能在ISO C中使用嵌套函数,因此如果它没有引用块之外的东西,那么能够声明一个块作用域函数是没有意义的。
答案 1 :(得分:1)
功能不是对象。所以你对对象的看法并不适用于函数。