是否应在头文件中创建extern
函数?或者他们默认为extern
?
例如,我应该写这个:
// birthdays.h
struct person find_birthday(const char* name);
或者这个:
// birthdays.h
extern struct person find_birthday(const char* name);
答案 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文件中删除。