函数在头文件中应该被声明为 extern
吗?还是它们默认就是 extern
?
例如,我应该这样写吗:
// birthdays.h
struct person find_birthday(const char* name);
或者是这个:
// birthdays.h
extern struct person find_birthday(const char* name);
函数在头文件中应该被声明为 extern
吗?还是它们默认就是 extern
?
例如,我应该这样写吗:
// birthdays.h
struct person find_birthday(const char* name);
或者是这个:
// birthdays.h
extern struct person find_birthday(const char* name);
来自C语言书籍:
如果声明包含extern存储类别说明符,或者是没有存储类别说明符的函数的声明(或两者都有),那么:
- 如果已经存在一个具有文件作用域的可见标识符声明,则结果链接与可见声明的链接相同;
- 否则结果为外部链接。
因此,如果这是翻译单元中唯一的声明,则它将具有外部链接。
extern
非常重要,因此有时人们更喜欢明确地始终使用extern
(即使省略函数会暗示相同的链接)。 - Lou它们是用 "extern" 隐式声明的。
extern
;您必须在变量声明前显式添加extern
。正如我在我的答案中所指出的,我更喜欢在函数声明前加上extern
,以保持与少数全局变量声明的对称性,但编译器在函数声明前不需要extern
,许多人更喜欢在函数声明中省略它。函数定义可以通过复合语句或函数体(用{...}
括起来)而不是在函数签名后加分号来识别。 - Jonathan Leffler头文件中声明的函数通常是(除非你非常努力)extern
。个人而言,我更喜欢在那里看到显式的关键字 - 但编译器不需要它。这提醒读者它们是extern
,由于人类比计算机更容易出错,我发现这个提醒有所帮助。
对于变量,使用extern
关键字(没有初始化程序)在头文件中很重要。因此,为了与头文件中声明的(非常少的)全局变量对称,我也使用extern
来定义函数 - 即使这不是绝对必要的。
extern
;头文件中的声明要么是函数的 extern
或 static inline
,变量的则是 extern
或 static const
,其他很少需要。 - Christoph