繁体   English   中英

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

[英]In C, if objects declared at block scope have no linkage, why does function declaration inside main() without “extern” work?

据我所知,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;
}

上述计划的结果:8

并且在块作用域中声明的对象(如在函数体内)没有链接,除非前面带有关键字“extern”或“static”。

函数不是对象。

6.2.2在C11中说

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

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

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

这表示块范围对象没有链接,但没有函数。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM