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

bod*_*ydo 40 c extern

应该extern在头文件中进行功能吗?或者他们extern是默认的?

例如,我应该这样写:

// birthdays.h
struct person find_birthday(const char* name);
Run Code Online (Sandbox Code Playgroud)

或这个:

// birthdays.h
extern struct person find_birthday(const char* name);
Run Code Online (Sandbox Code Playgroud)

Mat*_*hen 18

来自C书:

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

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

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

  • 有点困惑 (9认同)

tur*_*1ng 15

它们被隐含地声明为"extern".

  • @Aravind — 不,变量没有隐式声明为“extern”;您必须在变量声明前面显式添加“extern”。正如我在回答中指出的那样,我也更喜欢在函数声明前面使用“extern”,以便与少数全局变量声明对称,但是编译器在函数声明之前不需要“extern”,并且许多人更喜欢将其从函数声明。函数定义可以通过复合语句或函数体(用“{ … }”括起来)来识别,而不是通过函数签名后面的分号来识别。 (2认同)

Jon*_*ler 13

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

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

  • 我添加了明确的`extern`井; 头文件中的声明是函数的`extern`或`static inline`,变量的`extern`或`static const`; 很少需要其他任何东西 (4认同)

Stu*_*tLC 11

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

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