在我看来,即使我没有使用extern声明,在另一个文件中引用一个函数,gcc也可以编译该单元。因此,我想知道函数是否需要在任何地方使用extern声明?我知道你需要为变量使用extern。
默认情况下,函数具有extern存储类别说明符(除非它们明确定义为静态)。
如果声明描述一个函数或者出现在函数之外并描述具有外部链接的对象,则关键字extern是可选的。如果您不指定存储类别说明符,则函数被认为具有外部链接。
....
如果在不带存储类别说明符的声明之前包含相同函数的声明并使用了静态存储类别说明符,由于这些声明不兼容,会导致错误。将extern存储类别说明符包含在原始声明中是有效的,函数将具有内部链接。
虽然不是必需的,但我更喜欢在标题中使用它,以加强这个函数是在其他地方定义的这个概念。
对我来说,这样做:
int func(int i);
这是一个函数的前向声明,稍后会用到,而这个:
extern int func(int i);
这是一个函数声明,它将在此处使用,但在其他地方定义。
这两行代码在功能上是相同的,但我使用 extern
关键字来记录它们之间的区别,并保持与普通变量的一致性(在普通变量中差异很重要,并具有确切的含义)。
const
或最多一个参数的空间。这还取决于您认为有太多参数的数量。 - Chris Lutz你不一定需要使用extern关键字来声明变量。
C语言发明时,Unix链接器也随之诞生,并以不为人知但聪明的方式推进了技术的发展。其中一个贡献是将所有符号定义为小型“公共块”。这样就可以使用单个语法来声明,而无需指定哪个模块正在分配空间(只有一个模块实际上可以初始化该对象,但没有人需要这样做)。
实际上有三种情况需要考虑:
原型的前向声明(可选,因为遗留的C代码必须在没有它们的情况下编译)。
除了一个文件外,所有文件中非函数对象(变量)的外部声明(仅在具有低劣链接器的非Unix系统上需要。希望这些情况现在很少见)。
对于函数,如果没有函数体形成定义,则默认为外部声明。
ld(1)
可以为每个符号执行一个公共块。 - DigitalRossld
链接器的技术优点。到目前为止,我已经提供了我的观点的技术例子,而你只是批评我对它的赞赏。我曾经编写过链接器,并在这里提出了技术论点。你只是抛泥并陈述意见。你能否用一些技术方面的东西提高一下自己的水平? - DigitalRoss