【问题标题】:In C, if objects declared at block scope have no linkage, why does function declaration inside main() without "extern" work?在 C 中,如果在块范围内声明的对象没有链接,为什么 main() 中没有“extern”的函数声明起作用?
【发布时间】:2014-09-01 14:49:58
【问题描述】:

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

但是为什么下面的函数声明能够链接到 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

【问题讨论】:

  • @sashoalm,“链接”是 C 标准定义的一个术语,它没有说明链接器。这是一种语言功能。
  • 因为您从main() 调用该函数,而main() 已经知道该函数的原型是什么。
  • @Don'tYouWorryChild,不,它没有,直到main 之后才定义该函数,因此直到在main 中声明它之前,对此一无所知

标签: c function declaration extern linkage


【解决方案1】:

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

函数不是对象。

C11 中的 6.2.2 说

-5- 如果函数标识符的声明没有存储类说明符,则它的链接将完全确定,就好像它是使用存储类说明符extern 声明的一样。如果对象标识符的声明具有文件范围且没有存储类说明符,则其链接是外部的。

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

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

也就是说块范围的对象没有链接,但没有函数。

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

【讨论】:

  • 谢谢你..这回答了我的问题。
  • @Meathead 如果这回答了您的问题,为什么不接受它作为答案?
【解决方案2】:

函数不是对象。所以你所说的关于对象的内容并不适用于函数。

【讨论】:

  • 那么在链接方面,是否可以说即使在块范围内声明函数也具有外部链接?
猜你喜欢
  • 1970-01-01
  • 2012-01-04
  • 1970-01-01
  • 2012-08-27
  • 1970-01-01
  • 2018-07-12
  • 2015-10-03
  • 2022-11-30
  • 2010-09-10
相关资源
最近更新 更多