在我看来,即使我在另一个带有extern声明的文件中引用一个函数,gcc仍然可以编译该单元.所以我想知道extern声明是否在函数的任何地方都是必要的?我知道你需要extern变量.
Pra*_*rav 12
函数默认具有extern存储类说明符(除非它们明确定义为static)
如果声明描述函数或出现在函数外部并描述具有外部链接的对象,则关键字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关键字来记录差异,并与常规变量保持一致(差异很重要,并且具有完全相同的含义).
你并不一定是" 需要 " 的extern变量.
当C被发明时,Unix连接器也被编写,并且他们以无人问津但巧妙的方式推进了艺术.一个贡献是将所有符号定义为小的"公共块".这允许声明的单一语法,没有必要的规范,哪个模块正在分配空间.(实际上只有一个模块可以初始化对象,但不需要任何人.)
实际上有三个考虑因素.
原型的前向声明.(可选,因为遗留C必须在没有它们的情况下进行编译.)
除一个文件外的所有文件中的非函数对象(变量)的外部声明.(仅在非Unix系统上也需要使用可靠的链接器.希望这种情况很少见.)
对于函数,如果没有函数体来形成定义,则extern已经是假设.
| 归档时间: |
|
| 查看次数: |
4825 次 |
| 最近记录: |