使用extern和#including头文件有什么区别?

Mid*_*lue 17 c

我开始质疑"extern"关键字的用处,该关键字用于访问其他模块中的变量/函数(在其他文件中).当我们使用#include预处理器导入带有变量/函数原型或函数/变量定义的头文件时,我们不是在做同样的事吗?

Mic*_*ael 20

extern 是必需的,因为它声明符号存在且属于某种类型,并且不为其分配存储空间.

如果你这样做:

int foo;
Run Code Online (Sandbox Code Playgroud)

在多个源文件之间共享的头文件中,您将收到链接器错误,因为每个源都会创建自己的foo副本,并且链接器将无法解析该符号.

相反,如果你有:

extern int foo;
Run Code Online (Sandbox Code Playgroud)

在标题中,它将声明一个在每个源文件中的其他位置定义的符号.

一个(也是唯一一个)源文件将包含

int foo;
Run Code Online (Sandbox Code Playgroud)

它为链接器创建了一个foo实例来解析.

  • 但是,只要包含包含其定义的头文件,您是否仍然可以在不使用extern int foo声明的情况下访问int foo? (2认同)
  • 正如jcopenha所提到的,#include只是将包含文件中的文本插入到源文件中 - 编译器并不真正意识到包含文件,也没有特别对待它们.所以,如果你有Ac,Bc和Cc,每个都有"int foo"并将它们链接在一起,你如何解决foo?它存在于3个不同的地方.extern只是意味着,符号存在于其他地方.您可以使用它,但其他人负责创建它. (2认同)