C++ 使用extern函数而不是包含定义该函数的头

C++ 使用extern函数而不是包含定义该函数的头,c++,c,C++,C,根据这个问题,我知道extern对于变量非常重要,我完全明白使用extern变量的意义和原理 但是我仍然不能理解extern函数背后的思想,我知道它是如何工作的,链接以及所有这些,但是如果我们在头文件中定义了函数,这不是一样的吗 我只能想到使用动态链接库的好处,这样我们就不必在库每次更改时都构建应用程序,但为什么我会不厌其烦地使用静态链接库而不是只包含头文件 更新: 我知道定义和声明之间的区别。理解这一点的先决条件:研究定义 我知道extern对于变量非常重要 事实并非如此extern是一种几乎

根据这个问题,我知道
extern
对于变量非常重要,我完全明白使用
extern
变量的意义和原理

但是我仍然不能理解
extern
函数背后的思想,我知道它是如何工作的,链接以及所有这些,但是如果我们在头文件中定义了函数,这不是一样的吗

我只能想到使用动态链接库的好处,这样我们就不必在库每次更改时都构建应用程序,但为什么我会不厌其烦地使用静态链接库而不是只包含头文件

更新:


我知道定义和声明之间的区别。

理解这一点的先决条件:研究定义

我知道extern对于变量非常重要

事实并非如此
extern
是一种几乎多余的语言功能,使用非常有限。正确设计的程序不需要它——它只在非常特殊的场景中使用。如果你发现自己在日常编程中使用它,这意味着你的程序设计有缺陷

但是我仍然不能理解extern函数背后的思想,我知道它是如何工作的,链接以及所有这些,但是如果我们在头文件中定义了这个函数,情况会不会一样呢

实际上,这与在头文件中声明函数是一样的。函数声明,例如
void func(void)
也是隐式的
extern
,您也可以键入
extern void func(void)这是100%等效的。编写程序的正确方法是在头文件中提供函数声明

您很可能根本不需要在任何地方使用
extern

  • 头文件将在预处理过程中添加到源代码
    .c
    中。C编译器编译一个大文件,并将所有头文件添加到此文件中

  • 在源文件中提供与.h文件中相同的函数原型和外部对象声明将具有相同的效果

  • extern
    与变量一起使用向编译器显示该变量是在项目中的某个位置定义的。它可以稍后在同一个编译单元(源文件)()或另一个编译单元中。链接期间将解析访问

  • 根据定义,函数是
    extern
    。如果函数未在调用位置之前定义或在其他编译单元中定义,现代C需要函数原型


  • 注意:默认情况下,所有函数都是
    extern
    链接,除非明确提到
    static
    对其进行了限制,否则它仅限于文件范围。这些与转发声明(即,放入头文件)有什么关系?您似乎混淆了“define”和“declare”这两个术语——它们不是一回事,在C和C++中有非常具体的含义。我真的不理解这个问题。是否在头中或其他地方声明函数,以及是否声明它
    extern
    ,都是独立的问题,不是吗?通常不需要在函数声明上使用
    extern
    ,无论它们在哪里。人们经常这样做,出于风格的原因,或者出于习惯。Linux内核标题中充满了
    extern
    (a)编辑问题以澄清是否询问了声明和/或定义。如果未询问头文件中的定义,请删除对定义的提及。(b) 编辑问题以添加示例。(c) 编辑问题以删除短语“
    extern
    function”。我认为此时,您正在询问“使用
    extern
    的函数声明”(c)请说明您认为动态链接库和静态链接库之间有什么区别。对于变量,我完全不同意。我在C编程和系统设计方面工作了20多年,在此期间我只使用过一次或两次
    extern
    。有了这些经验,我可以自信地向您挑战,请您提供一个您认为需要
    extern
    的示例,我可以指出您整个程序设计中的缺陷。当然,有一些特殊情况,如答案中所述,内存映射硬件寄存器的非标准微控制器寄存器映射有时可能会使用它。这是我所知道的唯一有效的场景。由于缺乏更好的词汇,用全局状态表示全局对象是合理的。“STDIN和STDUT,以及他们的C++对应者。”@ Lundin >代码>我已经用C编程和系统设计工作了20多年,在那个时候,我只使用了一次或两次Extn。< /Cord>这个问题不是关于好的编程实践和全局对象是多么的坏或好,但是关于语言本身,@OmarKhalid有许多著名的、引人注目的C库,它们编写得非常糟糕。Windows API和Unix/Linux API是两个完美的例子。仅仅因为这些产品是成功的,并不意味着这些产品是成功的,因为它们编写了精彩的代码。