48

函数应该extern在头文件中创建吗?或者他们extern是默认的?

例如,我应该这样写:

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

或这个:

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

5 回答 5

23

来自C 书

如果声明包含 extern 存储类说明符,或者是没有存储类说明符(或两者都有)的函数声明,则:

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

因此,如果这是唯一一次在翻译单元中声明它,它将具有外部链接。

于 2010-07-29T21:38:51.927 回答
20

它们用“extern”隐式声明。

于 2010-07-29T21:37:25.607 回答
18

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

extern对于变量,在头文件中使用关键字(并且没有初始化器)很重要。因此,为了与头文件中声明的(极少数)全局变量对称,我也使用extern该函数 - 即使严格来说没有必要。

于 2010-07-29T22:51:24.910 回答
15

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

但是在.h头文件中定义的变量,然后#included在多个.c文件中定义的变量需要声明为 extern

于 2010-07-29T21:42:52.327 回答
2

我从不打扰源代码中的“外部”,但有些人会这样做。在我看来,在变量而不是函数之前有 extern 可以更直观地看出哪些是函数,哪些是变量(可能包括函数指针)。我认为很大程度上可能取决于 .h 文件中的声明是如何创建的,以及它们与主 .c 文件的关系。我通常首先输入 .h 文件原型,然后复制/粘贴到 .c 文件并添加函数体(在原型末尾打分号),因此必须将“extern”添加到头文件或复制/粘贴后从主 .c 文件中删除。

于 2010-07-30T14:36:28.330 回答