函数应该在头文件中“extern”吗?

时间:2010-07-29 21:33:07

标签: c extern

是否应在头文件中创建extern函数?或者他们默认为extern

例如,我应该写这个:

// birthdays.h
struct person find_birthday(const char* name);

或者这个:

// birthdays.h
extern struct person find_birthday(const char* name);

5 个答案:

答案 0 :(得分:18)

来自The C Book

  

如果声明包含extern   存储类说明符,或者是   声明没有的功能   存储类说明符(或两者),   然后:

     
      
  • 如果已有该标识符的可见声明   文件范围,产生的链接是   与可见的相同   声明;
  •   
  • 否则结果是外部联系。
  •   

因此,如果这是它在翻译单元中宣布的唯一时间,那么它将具有外部链接。

答案 1 :(得分:13)

它们是用“extern”隐式声明的。

答案 2 :(得分:13)

标题中声明的函数通常是(除非你真的很努力)extern。就个人而言,我更喜欢在那里看到显式关键字 - 但编译器不需要它。它提醒读者他们是extern,并且由于人类比计算机更容易犯错,我发现提醒有帮助。

对于变量,在头文件中使用extern关键字(并且没有初始化程序)很重要。因此,对于在头文件中声明的(极少数)全局变量的对称性,我也使用extern函数 - 即使它是严格不必要的。

答案 3 :(得分:9)

不,头文件中声明的函数不需要声明extern

但变量在.h标题中定义,然后在多个#included文件中.c定义{{1}}。

答案 4 :(得分:2)

我从不在我的源代码中使用“extern”,但有些人却这么做。在我看来,在变量之前使用extern而不是函数使得在视觉上更明显哪些是函数,哪些是变量(可能包括函数指针)。我想很多可能取决于.h文件中的声明是如何创建的,以及它们与主.c文件的关系。我通常首先输入.h文件原型,然后复制/粘贴到.c文件并添加函数体(在原型的末尾敲击分号),因此需要将“extern”添加到头文件或在复制/粘贴后从主.c文件中删除。