C中是否需要函数的extern关键字?

Xia*_* Li 16 c extern

在我看来,即使我在另一个带有extern声明的文件中引用一个函数,gcc仍然可以编译该单元.所以我想知道extern声明是否在函数的任何地方都是必要的?我知道你需要extern变量.

Pra*_*rav 12

函数默认具有extern存储类说明符(除非它们明确定义为static)

extern存储类说明符

如果声明描述函数或出现在函数外部并描述具有外部链接的对象,则关键字extern是可选的.如果未指定存储类说明符,则假定该函数具有外部链接.

....

由于声明不兼容,在声明之前包含没有存储类说明符的存储类说明符static的相同函数的声明是错误的.在原始声明中包含extern存储类说明符是有效的,并且该函数具有内部链接.


Chr*_*utz 12

这没有必要,但我更喜欢它在标题中强化了这个函数在其他地方被定义的想法.

对我来说,这个:

int func(int i);
Run Code Online (Sandbox Code Playgroud)

是一个稍后需要的函数的前向声明,而这个:

extern int func(int i);
Run Code Online (Sandbox Code Playgroud)

是一个函数的声明,将在这里使用,但在别处定义.

这两行在功能上是相同的,但我使用extern关键字来记录差异,并与常规变量保持一致(差异重要,并且具有完全相同的含义).

  • 我必须说我发现它在标题中非常难看,因为它最终制作的原型几乎肯定超过80个字符,导致断线或水平滚动,这两者都不令人愉快. (2认同)

Dig*_*oss 6

并不一定是" 需要 " 的extern变量.

当C被发明时,Unix连接器也被编写,并且他们以无人问津但巧妙的方式推进了艺术.一个贡献是将所有符号定义为小的"公共块".这允许声明的单一语法,没有必要的规范,哪个模块正在分配空间.(实际上只有一个模块可以初始化对象,但不需要任何人.)

实际上有三个考虑因素.

  1. 原型的前向声明.(可选,因为遗留C必须在没有它们的情况下进行编译.)

  2. 除一个文件外的所有文件中的非函数对象(变量)的外部声明.(仅在非Unix系统上也需要使用可靠的链接器.希望这种情况很少见.)

  3. 对于函数,如果没有函数体来形成定义,则extern已经是假设.