我开始质疑“extern”关键字的用处,该关键字用于访问其他模块中的变量/函数(在其他文件中)。当我们使用#include预处理器导入带有变量/函数原型或函数/变量定义的头文件时,我们不是在做同样的事情吗?
答案 0 :(得分:20)
extern
是必需的,因为它声明该符号存在且属于某种类型,并且不为其分配存储空间。
如果你这样做:
int foo;
在多个源文件之间共享的头文件中,您将收到链接器错误,因为每个源都会创建自己的foo副本,并且链接器将无法解析该符号。
相反,如果你有:
extern int foo;
在标题中,它将声明一个在每个源文件中的其他位置定义的符号。
一个(也是唯一一个)源文件将包含
int foo;
为链接器创建单个foo实例以解析。
答案 1 :(得分:2)
没有。 #include是一个预处理器命令,它说“将此其他文件中的所有文本放在此处”。因此,包含文件中的所有函数和变量都在当前文件中定义。