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

问题描述 投票:0回答:6

函数应该在头文件中制作

extern
吗?或者它们是默认的
extern

例如,我应该这样写:

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

或者这个:

// birthdays.h
extern struct person find_birthday(const char* name);
c extern
6个回答
23
投票

来自C 书

如果声明包含 extern 存储类说明符,或者是 函数声明不带 存储类说明符(或两者), 然后:

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

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


21
投票

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


20
投票

标头中声明的函数通常是(除非你真的很努力)

extern
。就我个人而言,我更喜欢在那里看到显式关键字 - 但编译器不需要它。它提醒读者,他们是
extern
,而且由于人类比计算机更容易犯错,我发现这个提醒很有帮助。

对于变量,在头文件中使用

extern
关键字(并且不使用初始值设定项)非常重要。因此,为了与标头中声明的(很少)全局变量对称,我也将
extern
与该函数一起使用 - 尽管这完全没有必要。


16
投票

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

extern

但是在

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


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


0
投票
“函数应该在头文件中设置为 extern 吗?还是默认情况下它们是 extern 的?”

头文件中的函数应该是 extern 吗?

    这是一种观点,即使在开源中也存在差异。
我这样做的原因很简单。如果未在标头中声明,则可以在使用该函数之前在要使用它的文件中声明该函数 extern。 如果您将其放入头文件中,它将包含在使用该函数的 feil 中。

在这方面,我认为将 extern 放在标头中更正确。 然而,编译器是故意这样做的,因为有些糟糕的程序员不知道更好的东西。

或者它们默认是外部的?

    默认情况下,函数声明是显式 extern 的。
© www.soinside.com 2019 - 2024. All rights reserved.