Mea*_*ead 3 c declaration function extern linkage
据我所知,C中的对象有3种类型的链接:1)外部2)内部和3)无,并且在块范围内声明的对象,如在函数体内,没有链接,除非前面有关键字"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;
}
Run Code Online (Sandbox Code Playgroud)
上述计划的结果:8
并且在块作用域中声明的对象(如在函数体内)没有链接,除非前面带有关键字"extern"或"static".
函数不是对象.
6.2.2在C11中说
-5-如果函数的标识符声明没有存储类说明符,则确定其链接与使用存储类说明符声明的完全相同
extern.如果对象的标识符声明具有文件范围而没有存储类说明符,则其链接是外部的.
第一句话说在文件范围声明的函数就像声明一样extern.即使在块范围内声明,这也适用.下一段是:
-6-以下标识符没有链接:声明为对象或函数以外的任何标识符; 声明为函数参数的标识符; 没有存储类说明符声明的对象的块作用域标识符
extern.
这表示块范围对象没有链接,但没有功能.
你不能在ISO C中使用嵌套函数,因此如果它没有引用块外部的东西就能声明一个块作用域函数是没有意义的.