【问题标题】:Should functions be made "extern" in header files?是否应该在头文件中将函数设为“外部”?
【发布时间】:2010-07-29 21:33:06
【问题描述】:

函数应该在头文件中使用extern 吗?还是默认extern

例如,我应该这样写吗:

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

或者这个:

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

【问题讨论】:

标签: c extern


【解决方案1】:

来自The C Book

如果声明包含外部 存储类说明符,或者是 函数声明没有 存储类说明符(或两者), 那么:

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

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

【讨论】:

  • 有点混乱g
  • 因此,如果您首先在头文件中将函数声明为static,然后在下面的同一文件中放置另一个extern 声明,则后面的声明将被忽略。否则省略指定将隐含地使其成为extern。但在头文件中使用extern 表示变量 非常重要,因此人们有时更喜欢明确并始终使用extern(即使省略函数也意味着相同的链接)。跨度>
【解决方案2】:

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

【讨论】:

  • 变量也一样吗?
  • @Aravind — 不,变量没有隐式声明extern;您必须在变量声明前显式添加extern。正如我在回答中指出的那样,我也更喜欢在函数声明前使用extern,以与少数全局变量声明对称,但编译器在函数声明前不需要extern,许多人更喜欢将其排除在外函数声明。函数定义可以通过复合语句或函数体(包含在{ … }中)而不是函数签名后的分号来识别。
【解决方案3】:

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

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

【讨论】:

  • 我添加了明确的extern 一个井;头文件中的声明是externstatic inline 用于函数,externstatic const 用于变量;很少需要其他任何东西
【解决方案4】:

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

但是在.h 标头中定义变量,然后在多个.c 文件will need to be declared extern 中定义#included

【讨论】:

    【解决方案5】:

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

    【讨论】:

    • "extern" 当你需要在多个源文件(模块)之间直接共享全局变量时是必要的。您可以通过访问功能来避免这种情况,但这些当然是有代价的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多